web-dev-qa-db-ja.com

mpeg2をストリーミング可能または断片化されたmp4に変換する方法は?

Mythtvで記録されたmpg(mpeg2)ファイルをstreamablemp4ファイルに変換しようとしています。 mp4への変換は簡単ですが、使用する前にファイル全体を最初に変換する必要があります。クイックストリーミングのためにファイルの先頭に「movアトム」を置く変換ツールを使用する場合でも、それが起こる前にmp4全体をエンコードする必要があります。

私はavconvのドキュメントで「mov/mp4/ismv muxerはフラグメンテーションをサポートしています」と読みました。ファイルの先頭に「偽」のmov atomを配置し、ファイル全体の各キーフレームに新しいものを配置して、トランスコード中または変換が中断されたときにビデオをストリーミングできるようにします。 。

ファイルの変換方法についてavconvの指示( http://libav.org/avconv.html#MOV_002fMP4_002fISMV )に従っていると思いますが、エンコーダーがパラメーター。以下は私のコマンドと、それが生成するエラー出力です。私はグーグルと自分自身で答えを探し尽くしたが、何も手伝ってくれなかったので空白になった。

Avconvバージョン0.8.1-4:0.8.1-0ubuntu1でubuntu 12.04x64を実行しているシステム。

コマンド:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -c:a copy output.mp4

エラー:

[mp4 muxer @ 0x36772e0] [Eval @ 0x7fffeddb69b0] Undefined constant or missing '(' in 'frag_keyframe'
[mp4 muxer @ 0x36772e0] Unable to parse option value "frag_keyframe+empty_moov"
[mp4 muxer @ 0x36772e0] Error setting option movflags to value frag_keyframe+empty_moov.
Output #0, mp4, to 'output.mp4':
    Stream #0.0: Video: libx264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=-1--1, 90k tbn, 29.97 tbc
    Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, 384 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video -> libx264)
  Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?)

さまざまなマルチプレクサ(h264などの-fパラメーター)を試しましたが、movflagがサポートされていなかった(論理的)などのエラーがありました。

パッケージ、依存関係、またはポイントだけがありませんか?前もって感謝します。

5
Scrubb

この正確な問題について bug がlibavに提出されています。憂鬱なことに、対処されていないようです。 avconvは優れたエンコードツールであると考えるのが最善であると思いますが、優れたカプセル化ツールではありません。

最適な方法は、 GPAC のMP4Boxを使用することです。これは、主にメディアストリームをmp4ファイルにカプセル化することに関係していると思われるユーティリティです。たとえば、en/de/transcodingは行いません。 UbuntuにGPACをインストールする場合、次のように言うことができます。

MP4Box -add non-streamable.mp4 new-shiny-streamable.mp4

MP4Boxはデフォルトでmp4ファイルをストリーミング可能にします:

バージョン0.2.4の時点では、MP4Boxは常に0.5秒のインターリーブとメタデータでファイルを開始時に保存するため、HTTPストリーミングに適しています。 ( ソース

2
automatthias

here を参照してください:これはffmpegガイドですが、avconvにも同様に適用されます。

ストリーミング用のファイルの作成については知りませんが、エラーはプリセットを失っている可能性があり、おそらく品質設定もある可能性があります(ただし、他の品質設定がない場合、avconvはデフォルトとして-crf 23を使用していると思いますが)供給される)。試してください:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -preset medium -c:a copy output.mp4

プリセットは次のとおりです。超高速、超高速、超高速、高速、高速、中、低速、低速、超低速。プリセットが速いとエンコードは速くなりますが、ファイルが大きくなりますが、遅いプリセットはファイルが小さくなりますが、作成に時間がかかります。異なるプリセット間に品質の違いはありません。 「プラセボ」プリセットもありますが、これはx264開発者による冗談であり、無視する必要があります。

Ifそれが機能しない場合は、以下を使用してみてください:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -crf 20 -preset medium -c:a copy output.mp4

20は完全にarbitrary意的です。最適なcrf設定を選択してください。 Lower =画質は向上しますが、ファイルサイズは大きくなります。そのガイドによると、おそらく18〜28の間を使用する必要があります。

0
evilsoup