DASH動画に音声がない場合の対処法
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 の AdaptationSet・Representation・SegmentTemplate の階層を丸ごと分解した解説は DASH ディープ で確認できます。
まず試すこと
この順でやってみてください。大抵のケースはこれで解決します:
- 元の動画ページを開いて再生させる(再生しないと MPD を返さないサイトが多い)。
- FlowPick で MPD マニフェストを検出する。
- トラック一覧で映像トラックと音声トラックの両方にチェックを入れる。
- 映像の画質に見合った音声トラック(言語・ビットレートが合うもの)を 1 本選ぶ。
- 結合が終わるのを待ってから、音付きで再生する。

この手順でも音が出ない場合は、以下の症状に当てはめてください。
症状 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 なら、元の動画ページに戻ってログイン状態を保ち、拡張機能で再検出してください。AdaptationSet・Representation・SegmentTemplate が具体的にどんな形かは、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 は数分で期限切れ。熱いうちに取ってください。途中でご飯に行かない。
症状 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 を破れると主張するダウンローダーは嘘をついているか違法行為です。時間とディスクを無駄にしないでください。法的・技術的なラインは ストリーミングのダウンロードは合法か?技術と法律のチェックリスト を参照してください。
診断ツール早見表
F12 で開発者ツールを開いて、よく使うチェックポイント:
| チェック | パネル | 操作 |
|---|---|---|
| MPD がリクエストされたか | Network | フィルタ欄に mpd と入力し、リロードして動画を再生 |
| 音声セグメントのステータスコード | Network | フィルタ欄に .m4s と入力し、Status 列とサイズを見る |
| どんなヘッダーが付いたか | Network → リクエスト → Headers | Request Headers に Referer/Cookie があるか |
| 結合エラー | Console | ffmpeg または 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 のスタンスです。法的・技術的なラインの詳細は ストリーミングのダウンロードは合法か?技術と法律のチェックリスト を参照してください。
関連ドキュメント
- DASH ダウンローダー —— オンラインツール。ホットリンク対策のない公開 DASH ストリーム向け
- M3U8 トラブルシューティング —— HLS 系の総合切り分け。CORS/ホットリンク対策の手法は共通
- 動画メディア検知 —— HLS/DASH 検出と音声/映像の分離処理
- ダウンロードエンジンアーキテクチャ —— DASH 音声/映像の並列ダウンロード、リトライ、3 段階書き込み
- フォーマット変換 —— fMP4 の再構成と音声/映像の分離結合
- 既知の制限事項 —— DRM、分離音视频ストリームなどのハード制限
- DASHストリーミングとは?非開発者向けMPDファイル解析 —— DASH とは何か、MPD の読み方
- DASH ディープ —— SegmentTemplate、ContentProtection などのエッジケース