フォーマット変換
FlowPick はストリーミングメディアをダウンロードすると同時に、セグメントをマージして標準フォーマットに変換できます。本ドキュメントでは、サポートされる変換パス、基盤となる技術原理、出力フォーマットの選択、およびパフォーマンス特性について説明します。

前提概念:コンテナ vs コーデック
フォーマット変換を理解する前に、混同しやすい2つの概念を区別する必要があります:
| 概念 | 説明 | 類比 |
|---|---|---|
| コンテナ(Container) | ファイルの「外殻」、ファイル拡張子と内部データの編成方式を決定 | 梱包箱——荷物の外形を決定 |
| コーデック(Codec) | 音声・動画データの圧縮アルゴリズム | 箱の中に入っている物品 |
FlowPick のフォーマット変換はコンテナのみを変更し、コーデックは変更しません(いわゆる「リマックス」または Remux)。これは以下を意味します:
- 動画画質と音声音質は完全に不変
- 変換速度が高速(再エンコードを伴わない)
- コーデック形式を変更できない(例:H.265 → H.264)
変換パス概要
FlowPick は以下の変換パスをサポートしており、HLS と DASH という2つの主流ストリーミングプロトコルをカバーしています:
| ソース形式 | ターゲット形式 | 変換方式 | 速度 | 品質 | 典型的なシーン |
|---|---|---|---|---|---|
| HLS (TS セグメント) | MP4 | FFmpeg WASM リマックス | 中等 | ロスレス | 一般再生、動画編集 |
| HLS (TS セグメント) | TS | バイナリ直接連結 | 極速 | ロスレス | 速度重視、後続処理 |
| DASH (MP4 セグメント) | MP4 | FFmpeg WASM リマックス | 中等 | ロスレス | 一般再生 |
| DASH (FMP4 セグメント) | MP4 | FFmpeg WASM 再構成 | 中等 | ロスレス | 初期化セグメントが必要 |
| DASH (分離音声/動画) | MP4 | FFmpeg WASM マージ | やや遅い | ロスレス | DASH 音声/動画分離ストリーム |
「ロスレス」とは再エンコを行わず、コンテナ形式のみを変更することを指します。動画と音声のコーデックデータは不変です。
変換技術原理
FlowPick は2セットの変換エンジンを使用し、シーンに応じて最適なソリューションを自動的に選択します:
| エンジン | 適用シーン | メリット | デメリット |
|---|---|---|---|
| FFmpeg WASM | TS→MP4 リマックス、DASH マージ、音声/動画マージ | 機能完全、複雑な変換をサポート | WASM ファイルの読み込みが必要、メモリ消費量が高い |
| TSToMP4Muxer | TS→MP4 ストリーミングリマックス | 純 JS 実装、FFmpeg の読み込み不要、メモリ効率が高い | TS→MP4 の単一シーンのみサポート |
TS セグメント → MP4(FFmpeg WASM リマックス)
HLS ストリームは通常 MPEG-TS コンテナでカプセル化されます。MP4 へ変換する際、FlowPick は FFmpeg WASM を使用して以下の操作を実行します:
入力:複数の .ts セグメントファイル
処理フロー:
- すべての TS セグメントを FFmpeg 仮想ファイルシステム(WASM メモリ)に書き込む
- concat ファイルリスト(
filelist.txt)を生成 - リマックスコマンドを実行:
ffmpeg -f concat -safe 0 -i filelist.txt \
-c copy \
-movflags +faststart \
-bsf:a aac_adtstoasc \
output.mp4
主要パラメータ説明:
| パラメータ | 役割 | 必要な理由 |
|---|---|---|
-f concat | concat demuxer を使用してセグメントを連結 | TS セグメントは直接マージできず、demuxer での処理が必要 |
-safe 0 | 任意のファイルパスを許可 | WASM 仮想ファイルシステムのパス形式が特殊 |
-c copy | ストリームコピーモード、再エンコードなし | ロスレス変換を保証、最高速度 |
-movflags +faststart | moov atom をファイル先頭に移動 | ネットワーク漸進式再生をサポート、ダウンロードしながら視聴可能 |
-bsf:a aac_adtstoasc | AAC 音声フォーマット変換 | TS は ADTS フォーマットを使用、MP4 は ASC フォーマットが必要 |
パフォーマンス特性:
- エンコード/デコードを伴わないため、CPU 消費量が低い
- 主な処理時間はファイル I/O(WASM 仮想ファイルシステムの読み書き)
- 処理速度は約 50-100 MB/s(CPU とセグメント数に依存)
TS セグメント → MP4(TSToMP4Muxer ストリーミングリマックス)
大容量ファイルシーンでは、FlowPick は自社開発の TSToMP4Muxer を優先してストリーミングリマックスを行い、FFmpeg WASM のメモリ制限を回避します:
処理フロー:
- セごとに TS パケット(188バイト/パケット)を解析し、PES データを抽出
- リアルタイムで MP4 フォーマットのメディアデータに変換
- Streams API 経由でストリーミング書き込みをディスク(FSA)またはメモリ(Blob)に行う
メリット:
- 純 JavaScript 実装、FFmpeg WASM の読み込み不要(約30MB のメモリ節約)
- ストリーミング処理、メモリ消費量はファイルサイズに依存しない
- File System Access API を使用した直接ディスク書き込みをサポート
デメリット:
- TS→MP4 の単一変換パスのみサポート
- 音声/動画分離マージには非対応
TSToMP4Muxer は FlowPick の中核的なイノベーションの1つです。これにより、ブラウザで GB レベルの動画ファイルを処理することが可能になり、メモリオーバーフローを引き起こしません。詳細は ダウンロードエンジン を参照。TS セグメント → TS(直接連結)
これが最も高速な「変換」方式です——実際には一切変換を行わず、TS セグメントを順番にバイナリ連結するだけです。
処理フロー:
- すべての TS セグメントをメモリにダウンロード
- 順序通りに
ArrayBufferを単一のUint8Arrayに連結 - 直接ファイルに書き込む
メリット:
- CPU オーバヘッドゼロ、速度はディスク書き込み速度のみに依存
- 完全忠実、どのバイトも変更しない
- 後続で専門ツールを使用して処理するシーンに適している
デメリット:
- ファイルサイズは MP4 よりやや大きくなる可能性がある(TS コンテナのオーバヘッド約 5-15%)
- 一部のプレイヤーは TS ファイルのサポートが MP4 より劣る
DASH セグメント → MP4
DASH ストリームのセグメントは通常 MP4 または FMP4 フォーマットです。変換プロセス:
標準 MP4 セグメント:
ffmpeg -f concat -safe 0 -i filegment_list.txt \
-c copy \
-movflags +faststart \
output.mp4
FMP4 セグメント(初期化セグメントが必要):
ffmpeg -i init.mp4 -i video.mp4 -i audio.mp4 \
-c:v copy -c:a copy \
-movflags +faststart \
output.mp4
音声/動画分離マージ
DASH ストリームの動画と音声は通常異なる AdaptationSet にあります。マージプロセス:
ffmpeg -f concat -safe 0 -i video_list.txt \
-f concat -safe 0 -i audio_list.txt \
-c:v copy -c:a copy \
-movflags +faststart \
-bsf:a aac_adtstoasc \
output.mp4
出力フォーマット選択ガイド
MP4(推奨)
適用シーン:
- さまざまなプレイヤーやデバイスで再生する必要がある
- 動画編集ソフトウェア(Premiere、DaVinci Resolve など)にインポートする必要がある
- 動画プラットフォーム(YouTube、Bilibili など)にアップロードする必要がある
- 最大互換性を確保する必要がある
技術的詳細:
- コンテナ:MPEG-4 Part 14
- MIME タイプ:
video/mp4 - H.264/AVC、H.265/HEVC、AAC、MP3 などのコーデックをサポート
faststartフラグでネットワーク漸進式再生を保証
TS
適用シーン:
- 最速ダウンロード速度を追求する(リマックスステップをスキップ)
- 後続で専門ツール(FFmpeg コマンドラインなど)でさらに処理する
- ソースストリーム自体が TS フォーマットで変換が不要
- 一時保存、後続で削除する可能性がある
技術的詳細:
- コンテナ:MPEG Transport Stream
- MIME タイプ:
video/mp2t - 各セグメントが独立して再生可能
- ファイルサイズは通常 MP4 より 5-15% 大きい
フォーマット選択決定木
最大互換性が必要? ──はい──→ MP4 を選択
│
いいえ
│
▼
最速速度を追求? ──はい──→ TS を選択
│
いいえ
│
▼
後続で FFmpeg で処理? ──はい──→ TS を選択
│
いいえ
│
▼
MP4 を選択(推奨)
パフォーマンス比較
以下は典型的な条件下(Chrome 126、Intel i7-13700、16GB RAM)での実測データです:
| シーン | セグメント数 | 合計サイズ | TS 連結 | MP4 リマックス (FFmpeg) | MP4 ストリーミング (Muxer) |
|---|---|---|---|---|---|
| 10分 1080p 動画 | ~60 | ~200 MB | <1秒 | ~3秒 | ~2秒 |
| 30分 1080p 動画 | ~180 | ~600 MB | <1秒 | ~8秒 | ~5秒 |
| 60分 4K 動画 | ~360 | ~2.5 GB | ~2秒 | ~30秒 | ~18秒 |
| 120分 4K 動画 | ~720 | ~5 GB | ~4秒 | ~60秒 | ~35秒 |
上記データは推定値であり、実際のパフォーマンスは CPU、メモリ、ブラウザ状態に依存します。ストリーミング Muxer は大容量ファイル処理時にメリットがより顕著になります。
変換速度に影響する要因
| 要因 | 影響度 | 説明 |
|---|---|---|
| セグメント数 | 高 | セグメントが多いほど、ファイル I/O 回数が増加 |
| ファイル合計サイズ | 高 | 直接的に読み書き時間に影響 |
| CPU パフォーマンス | 中 | FFmpeg WASM は CPU による demux/mux を必要とする |
| メモリサイズ | 中 | WASM 仮想ファイルシステムに十分なメモリが必要 |
| ディスク書き込み速度 | 中 | FSA で直接書き込む際に影響较大 |
| ブラウザバージョン | 低 | 新しいバージョンのブラウザは WASM パフォーマンスが向上 |
制限と注意事項
コーデック形式制限
FlowPick の変換はコンテナ形式のみを変更し、再エンコードを行いません。これは以下を意味します:
| 制限 | 説明 | 影響 |
|---|---|---|
| コーデック変換不可 | H.265 ソースの出力は依然として H.265 | 古いプレイヤーはサポートしない可能性がある |
| ビットレート変更不可 | 出力ビットレートはソースと一致 | ファイルサイズを圧縮できない |
| 解像度変更不可 | 出力解像度はソースと一致 | 画質のダウングレードまたはアップグレード不可 |
| フレームレート変更不可 | 出力フレームレートはソースと一致 | 60fps→30fps の変換不可 |
| 非標準サンプリングレート | 出力は元のまま | 一部のプレイヤーで異常動作の可能性 |
メモリ制限
FFmpeg WASM はブラウザ内で実行され、以下の制限を受けます:
| 制限項目 | 具体的数値 | 影響 |
|---|---|---|
| WASM メモリ上限 | 4GB(32ビットアドレス空間) | 超大容量ファイルは制限を超える可能性 |
| 仮想ファイルシステム | メモリに格納 | ファイルサイズは利用可能なメモリに制限 |
| マルチスレッドモード | SharedArrayBuffer が必要 | 正しい COEP/COOP ヘッダーが必要 |
ブラウザ互換性
| 機能 | Chrome | Edge | Firefox | Safari |
|---|---|---|---|---|
| FFmpeg WASM シングルスレッド | サポート | サポート | サポート | 部分サポート |
| FFmpeg WASM マルチスレッド | COEP/COOP が必要 | COEP/COOP が必要 | COEP/COOP が必要 | 非サポート |
| TSToMP4Muxer ストリーミング | サポート | サポート | サポート | サポート |
| TS 直接連結 | サポート | サポート | サポート | サポート |
コマンドライン代替案
コマンドラインに慣れている場合、ネイティブ FFmpeg を使用してより良いパフォーマンスを得ることができます:
# HLS → MP4
ffmpeg -i "https://example.com/playlist.m3u8" -c copy -bsf:a aac_adtstoasc output.mp4
# DASH → MP4
ffmpeg -i "https://example.com/manifest.mpd" -c copy output.mp4
# TS セグメントマージ
cat segment_*.ts > output.ts
# TS → MP4 リマックス
ffmpeg -i output.ts -c copy -bsf:a aac_adtstoasc output.mp4
ネイティブ FFmpeg のメリット:
| メリット | 説明 |
|---|---|
| ブラウザメモリ制限なし | 全システムメモリを使用可能 |
| ハードウェアアクセラレーションエンコード/デコード | NVENC、QSV、VideoToolbox などをサポート |
| より多くのフォーマットとコーデック | 数百種類のフォーマットとコーデックをサポート |
| 処理速度が高速 | ネイティブコードのパフォーマンスは WASM を大幅に上回る |
| 再エンコードをサポート | コーデック形式、ビットレート、解像度の変更が可能 |
よくある質問
変換後の MP4 ファイルが TS より小さいのはなぜですか?
TS コンテナは各 188 バイトのパケットにパケットヘッダーのオーバヘッドがあり、MP4 コンテナのインデックス構造はよりコンパクトです。リマックス後、ファイルサイズは通常 5-15% 減少しますが、音声・動画データは完全に不変です。
変換で画質が損なわれますか?
いいえ。 FlowPick は -c copy(ストリームコピー)モードを使用し、コンテナ形式のみを変更し、再エンコードを行いません。動画と音声のすべてのバイトがそのまま保持されます。
なぜ一部の動画は変換後に再生できないのですか?
考えられる原因:
- ソース動画があなたのプレイヤーがサポートしないコーデック(H.265 など)を使用している
- 変換プロセスでセグメントが欠落し、ファイルが不完全になっている
- ソースストリーム自体に問題がある
関連ドキュメント
- 動画検知 — HLS と DASH ストリームの検知原理について
- ダウンロードエンジン — ストリーミング処理とメモリ管理について深く理解
- 設定リファレンス — 出力フォーマットなどのダウンロード設定項目
- 使用ガイド — フォーマット変換の実際の手順
- ブラウザ互換性 — 各ブラウザの WASM と FSA のサポート状況
- よくある問題のトラブルシューティング — 変換関連問題の診断と解決
- 既知の問題 — フォーマット変換の既知の制限