M3U8 轉 MP4 後沒有聲音?原因分析與修復方法大全

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

M3U8 轉 MP4 沒聲音修復


為什麼轉檔後會沒有聲音?

原因一:音訊編碼格式不相容(最常見)

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

這個操作只轉碼音訊,通常幾秒鐘就能完成。


預防勝於治療:下載前的檢查清單

  1. 先用播放器測試:在 M3U8Go 線上播放器 中確認串流有聲音
  2. 檢查音訊格式:用 ffprobe 確認音訊編碼
  3. 優先使用 -c:a aac:下載時直接轉碼音訊,避免事後補救
  4. 注意多語言串流:確認是否有獨立的音訊 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 線上播放器