DASH動画に音声がない場合の対処法

MPD・MPEG-DASHの映像と音声トラック、CORS、DRM、マニフェスト不備による無音問題を解決します。

DASH をダウンロードしたのに音が出ない。十中八九は同じ落とし穴です:映像と音声は別々のトラックで、映像トラックだけ持ち帰っているんです。この記事は MPD の実際の処理フローに沿って、どこで音が消えたのか、どうやって取り戻すのかを順に説明します。


まず理解する:なぜ DASH は音を失うのか

MPD は「1 URL が 1 ファイル」ではありません。映像・音声・字幕を AdaptationSet でグループに分け、各グループの中にビットレート/画質ごとの Representation が並ぶ XML ツリーです。構造を見れば一発です:

MPD
├── AdaptationSet: Video
│   └── Representation 1080p
│       ├── init segment(fMP4 ヘッダー、コーデック設定)
│       ├── segment-001.m4s
│       ├── segment-002.m4s
│       └── ...
└── AdaptationSet: Audio
    └── Representation 128kbps
        ├── init segment
        ├── segment-001.m4s
        ├── segment-002.m4s
        └── ...
                    ↓
            FFmpeg WASM 結合
                    ↓
              output.mp4

これは HLS とはまったく別物です。HLS は映像と音声を同じ TS セグメントに詰め込むことが多く、セグメントを引っ張れば音付きで揃います。DASH は fMP4 で音声と映像を別々に配信するので、両方のトラックを取得して結合する必要があります。ツールが映像トラックしか拾わなければ、出来上がるのはサイレント映画です。両者の違いは 動画メディア検知、MPD の AdaptationSetRepresentationSegmentTemplate の階層を丸ごと分解した解説は DASH ディープ で確認できます。

FlowPick の DASH 処理フロー:MPD 解析 → 映像/音声トラックの識別 → セグメントと初期化セグメントを個別ダウンロード → FFmpeg WASM で結合。実装の詳細は 動画メディア検知ダウンロードエンジンアーキテクチャ — DASH ストリームの特殊処理 を参照してください。

まず試すこと

この順でやってみてください。大抵のケースはこれで解決します:

  1. 元の動画ページを開いて再生させる(再生しないと MPD を返さないサイトが多い)。
  2. FlowPick で MPD マニフェストを検出する。
  3. トラック一覧で映像トラックと音声トラックの両方にチェックを入れる。
  4. 映像の画質に見合った音声トラック(言語・ビットレートが合うもの)を 1 本選ぶ。
  5. 結合が終わるのを待ってから、音付きで再生する。

この手順でも音が出ない場合は、以下の症状に当てはめてください。


症状 1:映像トラックしか選択していない

症状:ダウンロードが速い、ファイルは数 MB〜数十 MB、プレイヤーでは映像は出るが音が出ない。

いちばん多い原因で、ぶっちぎりです。DASH ダウンローダーはデフォルトでビットレート降順にトラックを並べるので、上の 1080p の行だけチェックして、その下にある「Audio」グループに気づかない人が多い。ffprobe 一発でファイルに音声ストリームがあるか確認できます:

ffprobe -hide_banner output.mp4

出力が Stream #0:0: Video だけ、Stream #0:1: Audio がないなら、これが原因です。MPD に戻って音声トラックも一緒にチェックして再ダウンロードしてください。FlowPick は同言語・最高ビットレートの音声トラックを自動でマッチするので、手計算は不要です。


症状 2:MPD にそもそも音声トラックがない

症状:トラック一覧をいくら見ても音声がない、あるいは「無音」の映像ストリームが 1 本だけ。

MPD は動的に生成され、同じ動画でも地域やログイン状態によって返ってくるマニフェストが変わります。よくあるのは次の 3 つ:

  • 地域制限:特定地域には映像トラックだけ、あるいは特定言語だけ配信される。
  • ログイン状態:未ログインだと MPD に音声 AdaptationSet がなく、ログインすると出てくる。
  • リクエストヘッダー:Referer/Cookie で音声トラックを渡すかどうかを決めるサイトがある。

MPD の URL を抜き出して curl で検証してください(URL は自分のものに置き換え):

curl -sL -H "Referer: https://www.example.com/watch/123" \
     "https://cdn.example.com/master.mpd" > master.mpd

# マニフェストに音声 AdaptationSet が本当にあるか確認
grep -c 'AdaptationSet.*type="audio"' master.mpd
# 出力 0 = 本当に音声トラックなし;>0 = あるのにチェックし忘れ(症状 1 に戻る)

出力が 0 なら、元の動画ページに戻ってログイン状態を保ち、拡張機能で再検出してください。AdaptationSetRepresentationSegmentTemplate が具体的にどんな形かは、DASHストリーミングとは?非開発者向けMPDファイル解析 が教科書よりずっとわかりやすく説明しています。


症状 3:CORS / 403 / 404

症状:映像トラックはダウンロードできるのに、音声セグメントを引っ張ると即 403/404、あるいはオンラインツールが CORS を報告する。

オンラインツールは flowpick.com ドメインで動くため、対象サイトの Cookie も元ページの Referer も付けられず、配信元サーバーに弾かれます。これはホットリンク対策であって、音声が無いこと自体の問題ではありません。対処:

  • ホットリンク対策のあるサイトでは拡張機能に切り替えて元の動画ページ上で操作する。Referer/Cookie が自動で付きます。
  • v1.1.1+ の拡張機能はホットリンク対策プロキシ内蔵。プレビューとダウンロードで Referer と Cookie を自動補完し、保存前にレスポンスも確認するので、HTML エラーページをメディアとして保存する事故も防ぎます。
  • ?token=xxx&expires=yyy 付きの音声セグメント URL は数分で期限切れ。熱いうちに取ってください。途中でご飯に行かない。
ホットリンク対策プロキシは v1.1.1 で追加されました。アップグレードすると Bilibili や Weibo のようなサイトの成功率が明らかに上がります。アップグレード方法は インストールガイド — 拡張機能の更新、機能の詳細は FlowPick v1.1.1:保護リソースのプレビューとダウンロード を参照。Referer 問題の完全な切り分け(curl での再現含む)は M3U8 トラブルシューティング — 403 とホットリンク対策 を参照してください。手法は DASH にもそのまま使えます。

症状 4:音声セグメントのダウンロードが不完全

症状:両方のトラックにチェックしたのに、結合後も無音または音が途切れる。コンソールに音声セグメントの失敗ログが数件ある。

音声と映像は別々にダウンロードされ、映像が全部揃っても音声が 1〜2 片足りない、という状況がありえます。結合時には欠けた音声トラックのまま進むしかありません。まず本当にセグメントが欠けているのか確認:

# 音声セグメントの HTTP ステータスを 1 つずつ確認(URL は自分のものに)
for i in $(seq 1 200); do
  url="https://cdn.example.com/audio/seg-$i.m4s"
  status=$(curl -s -o /dev/null -w "%{http_code}" "$url")
  echo "seg-$i.m4s -> $status"
done

403/404/5xx が出れば、取得できないセグメントがある証拠です。対策:

  • ネットワークが不安定なら並列数を 2〜3 に下げる。再送の負荷が減ります。音声トラックはそもそもセグメントが少ないので、遅くても問題ありません。
  • 一部だけ 5xx なら、しばらく待って再ダウンロード。配信元が CDN のオリジン回収中かもしれません。
  • 同じセグメントで毎回切れるなら、だいたい一時トークンの期限切れ。元ページに戻って再検出し、新しい MPD を取り直してください。

並列数と性能の関係は ダウンロードエンジンアーキテクチャ — 並列チューニング、リトライとバックオフのロジックは ダウンロードエンジンアーキテクチャ — リトライメカニズム を参照してください。


症状 5:ファイルサイズは正常なのに無音

症状:ファイルは小さいわけではない、ffprobe でも音声ストリームはある、なのに再生すると無音、または音ズレ。

これはたいていダウンロードの問題ではなく、結合またはエンコード段階の話です:

症状原因対処
音声ストリームはあるが再生は無音マクサーが音声を正しくペアリングできていない(H.265 映像 + 異常な音声識別)出力フォーマットを変えるか、ffmpeg コマンドラインでリマックスし直す
音ズレするSegmentTimeline のタイムスタンプが不連続FFmpeg で再エンコードして修復
VLC では再生できるのに OS 標準プレイヤーでは不可プレイヤーにデコーダーがない(VP9/AV1/Opus)VLC / PotPlayer に切り替え。ファイルは悪くない

ffmpeg で音声だけを抜き出して、音声自体が壊れていないか確認します:

ffmpeg -i output.mp4 -map 0:a -c copy audio.m4a
# 抜き出した audio.m4a が正常に再生できる → 音声は壊れていない、問題は結合側

FFmpeg WASM のリマックス原理は フォーマット変換 — TS セグメント → MP4(FFmpeg WASM リマックス)、音声/映像の分離結合フローは フォーマット変換 — 音声/動画分離マージ を参照してください。


症状 6:DRM 保護

症状:MPD 内に <ContentProtection> がある、または再生前に Widevine/PlayReady の CDM モジュールを読み込む。

これはダウンロードできません。FlowPick は明確に拒否します。機能であってバグではありません。DRM は権利元がハードウェアレベルの暗号でロックをかけており、DRM を破れると主張するダウンローダーは嘘をついているか違法行為です。時間とディスクを無駄にしないでください。法的・技術的なラインは ストリーミングのダウンロードは合法か?技術と法律のチェックリスト を参照してください。

DRM の検出方法と非対応コンテンツの一覧は 既知の制限事項 — DRM 保護コンテンツ、DASH の音声/映像分離の既知のエッジケースは 既知の制限事項 — 分離音视频ストリーム を参照してください。

診断ツール早見表

F12 で開発者ツールを開いて、よく使うチェックポイント:

チェックパネル操作
MPD がリクエストされたかNetworkフィルタ欄に mpd と入力し、リロードして動画を再生
音声セグメントのステータスコードNetworkフィルタ欄に .m4s と入力し、Status 列とサイズを見る
どんなヘッダーが付いたかNetwork → リクエスト → HeadersRequest Headers に Referer/Cookie があるか
結合エラーConsoleffmpeg または wasm で検索

環境情報について疑問がある場合は、Console で以下を実行して環境レポートを生成し、フィードバックに使ってください:

const report = {
  ua: navigator.userAgent,
  fsa: 'showDirectoryPicker' in window,
  sab: typeof SharedArrayBuffer !== 'undefined',
  coi: self.crossOriginIsolated,
  storage: await navigator.storage?.estimate().catch(() => null),
  ts: new Date().toISOString(),
}
console.log(JSON.stringify(report, null, 2))

レポートにはブラウザの環境情報しか含まれません。閲覧履歴や個人データは一切含まれません。


本当にダウンロードできない場合

  • DRM 保護コンテンツ(Widevine / PlayReady / FairPlay)
  • ログイン突破や有料壁の突破が必要なコンテンツ
  • 独自セグメントの MSE サイトで、素の MPD を出さないもの
  • 非公開ロスレスや個別暗号化された複数音声トラック

これらは設計上非対応であり、バグではありません。こういったケースでは、静かに壊れたファイルを作るのではなく、エラーを出すのが正しい振る舞いです。それが FlowPick のスタンスです。法的・技術的なラインの詳細は ストリーミングのダウンロードは合法か?技術と法律のチェックリスト を参照してください。


関連ドキュメント