ffmpeg: H264@MPEGTS を Smooth Streaming にパッケージ化する

ffmpeg: H264@MPEGTS を Smooth Streaming にパッケージ化する

私は(かなり大きな)ファイルのセットを持っていますが、H264MPEG-4 TS 形式コンテナ。時間的制約があるため、このコンテンツをトランスコードせずにスムーズ ストリーミングに再パッケージ化する必要があります (トランスコードには時間がかかりすぎるため)。

ffmpeg でこれを行う方法を見つけようとしています。ffmpeg には、このタスクに適した 2 つの異なる muxer があるようです。「smoothstreaming」muxer と「ismv」muxer の両方を試しましたが、どちらも問題が発生しています。

ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out

これにより、次のエラーが発生します。

ffmpeg バージョン N-79695-g675cfb2 Copyright (c) 2000-2016 FFmpeg 開発者
  gcc 5.3.1 (Debian 5.3.1-14) 20160409 でビルド
  構成:
  libavutil 55. 23.100 / 55. 23.100
  libavcodec 57. 38.100 / 57. 38.100
  libavフォーマット 57. 35.100 / 57. 35.100
  libavデバイス 57. 0.101 / 57. 0.101
  libavfilter 6. 44.100 / 6. 44.100
  libswscale 4. 1.100 / 4. 1.100
  libswresample 2. 0.101 / 2. 0.101
'input.mpg' からの入力 #0、mpegts:
  再生時間: 01:28:41.98、開始: 2.040000、ビットレート: 2500 kb/s
  プログラム1
    ストリーム #0:0[0x1e1]: ビデオ: h264 (メイン) ([27][0][0][0] / 0x001B)、yuv420p、720x576 [SAR 16:11 DAR 20:11]、25 fps、25 tbr、90k tbn
    ストリーム #0:1[0x1e2](eng): オーディオ: mp2 ([4][0][0][0] / 0x0004)、48000 Hz、ステレオ、s16p、192 kb/s
[smoothstreaming @ 0x2616340] AVStream.codec を使用してコーデック パラメーターを muxer に渡すことは非推奨です。代わりに AVStream.codecpar を使用してください。
    最後のメッセージが 1 回繰り返されました
[smoothstreaming @ 0x2616340] ストリーム 0 にビット レートが設定されていません
出力 #0、スムーズストリーミングを 'ss_out' に出力します。
  メタデータ:
    エンコーダ: Lavf57.35.100
    ストリーム #0:0: ビデオ: h264 ([33][0][0][0] / 0x0021)、yuv420p、720x576 [SAR 16:11 DAR 20:11]、q=2-31、25 fps、25 tbr、50 tbn
    ストリーム #0:1(eng): オーディオ: mp2 (i[0][0][0] / 0x0069)、48000 Hz、ステレオ、192 kb/s
ストリーム マッピング:
  ストリーム #0:0 -> #0:0 (コピー)
  ストリーム #0:1 -> #0:1 (コピー)
出力ファイル #0 のヘッダーを書き込めませんでした (コーデック パラメータが正しくありません ?): 引数が無効です

私が試したもう一つのことは、ffmpeg を使用して ismv にパッケージ化することです。

ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv

ここまでは問題なく動作しますが、マニフェスト ファイルを作成するには ismindex ツールが必要ですが、これは失敗します。

ismindex -n ss_out ss_out.ismv

Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)

何か間違っているのでしょうか、それとも入力ファイルに問題があるのでしょうか?

答え1

したがって、私の質問で考えていた 2 つの解決策はどちらも機能しますが、最終結果は異なります。

ISMV マルチプレクサー + ismindex

必要だったのは、サーバー側のファイル (.ism、.ismc、.ismv) のセットでした。これを実現するために、次の 2 つのことを行いました。

ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv

上記のコマンドは、ビデオ ストリームをトランスコードせずにコピーし、オーディオを AAC にトランスコードし (ただし、ffmpeg と ismindex はどちらも MP2 オーディオを扱わないようです)、それを .ismv にパッケージ化します。

ismindex -n ss_out ss_out.ismv

その後、ismindex ツールは必要な .ism ファイルと .ismc ファイルを作成します。

ここから取得したファイルは、Media Services を使用した IIS 経由でストリーミング可能でした。

スムーズストリーミングマルチプレクサー

最終的には 'smoothstreaming' マルチプレクサーも動作するようになりましたが、問題は、入力として .ismv ファイルも必要だったことです。そこで、まず上記と同じ ffmpeg コマンドを実行し、その後、再度 ffmpeg を使用して 'smoothstreaming' マルチプレクサーで再パッケージ化しました。

しかし、このソリューションで私が抱えていた問題は、従来の Web サーバーがスムーズなストリーミングを行うために必要なファイルが生成されることだった。そのため、ビデオ フラグメントが分割され、チャンクごとにメタデータが作成される。これらはすべて、通常ストリーミング サーバーによって処理される。

関連情報