M3U8からMP4への変換後に音が出ない?原因の分析と完全な修復方法

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

M3U8からMP4への変換で音が出ない問題の修復


なぜ変換後に音が出ないのか?

原因その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_nameaac ではない場合、または 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 オンラインプレーヤーを試す