M3U8からMP4への変換後に音が出ない?原因の分析と完全な修復方法
数分間待ってようやくM3U8ストリーム動画をMP4に結合できたと思い、動画を開いてみたら「映像は完璧だけど音が全くない」という経験はありませんか?これはM3U8を変換する際に最もよく発生する問題の一つですが、通常はあなたの操作に原因があるのではなく、「オーディオエンコード形式」の互換性に問題があります。

なぜ変換後に音が出ないのか?
原因その1:オーディオエンコード形式に互換性がない(最も一般的)
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だった場合、多くのプレーヤー(特にスマートフォンの内蔵プレーヤー)では「ミュート(無音)」になってしまいます。これはオーディオトラックが存在しないのではなく、単にプレーヤーがデコードできないだけなのです。
原因その2:TSセグメントにオーディオトラックが一切含まれていない
一部のHLSストリームでは、映像と音声を別々の独立したストリームとして分離していることがあります(特に多言語コンテンツによく見られます)。このとき:
- 映像用のM3U8には映像セグメントのみが含まれています。
- 音声にはまた別の独立したM3U8が存在します。
- 映像のM3U8だけをダウンロードした場合、当然音は出ません。
原因その3:映像と音声のタイムスタンプが同期していない
オーディオトラックは実際に存在するものの、TSセグメントのPTS/DTSタイムスタンプにジャンプがあるため、結合されたオーディオが奇妙な位置に「ズレて」しまうことがあります。これにより、プレーヤーが誤って「オーディオなし」と判断する可能性があります。
原因その4:結合の過程でオーディオトラックが失われた
TSセグメントのオーディオストリームIDが一致していない場合(例えば、一部のセグメントが stream 0 で、他のセグメントが stream 1 を使用しているなど)、-c copy を用いて結合する際にFFmpegが映像のみを取り込み、オーディオを見落とすことがあります。
FFmpegでの修復方法(ケースバイケースで対応)
修復法1:音声を強制的に 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 にトランスコードすればほぼすべてのデバイスで再生できるようになります。
修復法2:タイムスタンプの問題を修復する
ffmpeg -fflags +genpts -i input.m3u8 -c:v copy -c:a aac output.mp4
解説:
- -fflags +genpts:すべてのタイムスタンプを再生成し、PTS/DTS のジャンプ問題を修正します。
- 「時々音が出たり、出なかったりする」ような断続的な問題に適しています。
修復法3:オーディオストリームを明示的に指定する
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が自動的にストリームを選択する際に生じるオーディオトラックの見落としを防ぎます。
修復法4:分離されたオーディオストリームを結合する
映像と音声が別々の 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 は映像ストリームです。
- 2番目の -i は音声ストリームです。
- -map を使用して、映像は最初の入力から、音声は2番目の入力から取得するようにそれぞれ指定します。
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 オンラインプレーヤーを試す