M3U8 轉 MP4 後沒有聲音?原因分析與修復方法大全
你辛苦等了好幾分鐘,終於把 M3U8 串流轉成 MP4 了,結果打開一看——畫面完美,但完全沒有聲音。這是 M3U8 轉檔過程中最常見的問題之一,而且原因通常不在你的操作,而在「音訊編碼格式」的相容性。

為什麼轉檔後會沒有聲音?
原因一:音訊編碼格式不相容(最常見)
HLS 串流中的 .ts 片段,音訊編碼不一定是我們熟悉的 AAC。常見的「問題格式」包括:
| 音訊編碼 | 說明 | 常見於 | MP4 相容性 |
|---|---|---|---|
| AAC-LC | 標準 AAC | 大多數串流 | ✅ 完全相容 |
| HE-AAC v2 | 高效 AAC | 低位元率串流 | ⚠️ 部分播放器不支援 |
| AC-3 (Dolby) | 杜比音效 | 電影、高品質串流 | ❌ 多數 MP4 播放器不支援 |
| EAC-3 (Dolby Digital Plus) | 進階杜比 | 串流平台 | ❌ 大多不支援 |
| MP3 (MPEG-1 Layer 3) | 老式編碼 | 舊串流 | ⚠️ 封裝可能出問題 |
當你使用 ffmpeg -c copy(直接複製不轉碼)時,FFmpeg 會原封不動地把音訊放進 MP4 容器。如果原始音訊是 AC-3 或 EAC-3,許多播放器(尤其是手機內建播放器)就會「靜音」——不是沒有音軌,而是播放器解不了碼。
原因二:TS 片段根本沒有音軌
某些 HLS 串流會把影像和音訊分開成獨立的串流(尤其是多語言內容)。此時:
- 影像的 M3U8 只包含影像片段
- 音訊另有一個獨立的 M3U8
- 只下載影像的 M3U8,自然不會有聲音
原因三:音訊與影像的時間戳不同步
有時候音軌其實存在,但因為 TS 片段的 PTS/DTS 時間戳有跳動,導致合併後音訊被「偏移」到一個奇怪的位置。播放器可能會誤判為「無音訊」。
原因四:合併過程中音軌遺失
如果 TS 片段的音訊流 ID 不一致(例如某些片段是 stream 0,其他是 stream 1),-c copy 在合併時可能只抓到影像而漏掉音訊。
FFmpeg 修復方法(逐一對症下藥)
修復法一:強制轉碼音訊為 AAC(通殺最常見問題)
ffmpeg -i input.m3u8 -c:v copy -c:a aac -b:a 192k output.mp4
解釋:
- -c:v copy:影像不動,直接複製(速度快)
- -c:a aac:強制把音訊轉碼為 AAC 格式
- -b:a 192k:音訊位元率設為 192kbps(品質不錯且檔案不大)
這是最推薦的萬用修復法。不管原始音訊是 AC-3、EAC-3 還是其他格式,轉碼為 AAC 後幾乎所有裝置都能播放。
修復法二:修復時間戳問題
ffmpeg -fflags +genpts -i input.m3u8 -c:v copy -c:a aac output.mp4
解釋:
- -fflags +genpts:重新生成所有時間戳,修復 PTS/DTS 跳動問題
- 適用於「有時有聲音、有時沒聲音」的間歇性問題
修復法三:指定音訊流
ffmpeg -i input.m3u8 -map 0:v:0 -map 0:a:0 -c:v copy -c:a aac output.mp4
解釋:
- -map 0:v:0:明確選擇第一個影像流
- -map 0:a:0:明確選擇第一個音訊流
- 避免 FFmpeg 自動選擇流時漏掉音軌
修復法四:合併獨立的音訊串流
如果影像和音訊是分開的 M3U8:
ffmpeg -i video.m3u8 -i audio.m3u8 \
-c:v copy -c:a aac \
-map 0:v:0 -map 1:a:0 \
output.mp4
解釋:
- 第一個 -i 是影像串流
- 第二個 -i 是音訊串流
- -map 分別指定影像取自第一個輸入、音訊取自第二個輸入
如何判斷你的 M3U8 音訊是什麼格式?
在修復之前,先確認問題來源會比較有效率。用 FFmpeg 的 probe 功能:
ffprobe -i "https://example.com/stream.m3u8" -show_streams
重點看以下欄位:
codec_name=ac3 ← 這就是問題!應該轉碼為 aac
codec_type=audio
sample_rate=48000
channels=6 ← 6 聲道也可能造成問題
如果 codec_name 不是 aac,或 channels 超過 2(立體聲),就很可能是沒聲音的原因。
瀏覽器端工具的處理方式
使用瀏覽器端的 FFmpeg.wasm 工具時,合併通常使用 -c copy 直接複製。這代表:
- 如果原始音訊是 AAC → 正常有聲音 ✅
- 如果原始音訊是 AC-3 → 可能沒聲音 ⚠️
由於瀏覽器端重新編碼會大幅增加處理時間和記憶體消耗,目前多數瀏覽器工具不支援音訊轉碼。
若你使用本站的 HLS 下載工具 下載後發現沒有聲音,建議將下載的 MP4 檔案,用桌面 FFmpeg 補轉碼一次:
ffmpeg -i downloaded.mp4 -c:v copy -c:a aac -b:a 192k fixed.mp4
這個操作只轉碼音訊,通常幾秒鐘就能完成。
預防勝於治療:下載前的檢查清單
- 先用播放器測試:在 M3U8Go 線上播放器 中確認串流有聲音
- 檢查音訊格式:用
ffprobe確認音訊編碼 - 優先使用
-c:a aac:下載時直接轉碼音訊,避免事後補救 - 注意多語言串流:確認是否有獨立的音訊 M3U8
常見問題 FAQ
為什麼用 VLC 播放有聲音,但用手機卻沒有?
因為 VLC 內建了幾乎所有音訊解碼器(包括 AC-3、EAC-3),而手機內建播放器通常只支援 AAC。解決方法是轉碼音訊為 AAC。
-c copy 和 -c:a aac 差在哪?
-c copy 是直接複製原始資料,速度最快但不改變格式。-c:a aac 是重新編碼音訊為 AAC 格式,需要 CPU 運算但相容性最好。影像建議維持 -c:v copy 不重新編碼。
轉碼後音質會變差嗎?
使用 -b:a 192k 以上的位元率,一般聽覺上幾乎無差異。若對音質有極高要求,可以提高到 -b:a 320k。
想立即測試您的 M3U8 連結嗎?
🚀 立即測試 M3U8 線上播放器