Libav FAQ


Table of Contents


1 一般的な質問

1.1 Libav が機能 [xyz] をサポートしないのはなぜ?

それはその任務に取り掛かる人がいないからです。Libav の開発は 個々の開発者にとって重要な任務によって進められています。 あなたにとって重要な機能があるときには、それが実装されるようにする一番よい方法は あなた自身がその任務に着手することです。

1.2 Libav は XXX というコーデックをサポートしていません。サポートするために Windows の DLL ローダーを含めてみたら?

いいえ。Libav はオープンソースのコーデックしかサポートしません。Windows の DLL は移植可能でなく、 膨らみ過ぎで、また多くの場合遅いです。

1.3 ファイルが読めません。フォーマットは avconv でサポートされているようなのですが。

たとえ avconv がそのコンテナフォーマットを読むことができても、そのフォーマットの全てのコーデックを サポートしているとは限りません。avconv のドキュメントにあるサポートするコーデックのリストにあたって みてください。

1.4 どのコーデックが Windows でサポートされていますか?

追加のコーデックをインストールしない限り、 Windows は MPEG のような標準フォーマットを十分にはサポートしていません。

下に挙げる映像コーデックはほとんどの Windows システムで動作するでしょう:

msmpeg4v2

.avi/.asf

msmpeg4

.asf のみ

wmv1

.asf のみ

wmv2

.asf のみ

mpeg4

ffdshow または Xvid のような MPEG-4 コーデックがインストールされている場合に限る。

mpeg1video

.mpg のみ

Windows では ASF ファイルがしばしば .wmv や .wma という拡張子を持つので注意してください。 また Microsoft が ASF フォーマットの特許を主張しており、非 Microsoft のソフトウエアで ASF ファイルを作成するユーザーを訴える、もしくは脅かす恐れがある、ということも述べておくべきでしょう。 可能な場合には ASF を避けることを強く忠告します。

下に挙げる音声コーデックはほとんどの Windows システムで動作するでしょう:

adpcm_ima_wav
adpcm_ms
pcm_s16le

常時

libmp3lame

LAME のような MP3 コーデックがインストールされている場合。

2 コンパイル

2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'

これは gcc のバグです。私たちに報告しないでください。代わりに、gcc の開発者にそれを 報告してください。私たちは gcc のバグのための回避策を加えるつもりはないことに注意してください。

また gcc の開発者(のうちのいく人か)はこれがバグないし彼らが直すべきバグだと信じていないことに 注意してください: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203。 そしてさらに、彼らのうちには決定不可能な問題と NP-hard 問題の違いを分かっていないものもいます...。

3 使用法

3.1 JPEG ファイルを他のフォーマットにエンコードするには?

その JPEG ファイルが img1.jpg, img2.jpg, img3.jpg,... なら、次のようにします:

  avconv -f image2 -i img%d.jpg /tmp/a.mpg

%d’ は画像の番号に置き換えられます。

img%03d.jpg’ とすると ‘img001.jpg’, ‘img002.jpg’, ... などになります。

多数の画像をリネームする際には、次のようなコマンドを使って 負担を和らげることができます。このコマンドは、bourne shell の 構文を使って、カレントディレクトリにある *jpg に合致する すべてのファイルから ‘/tmp’ ディレクトリに ‘img001.jpg’、‘img002.jpg’ などと並べてシンボリックリンクを張ります。

  x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

これらを最も古い時点で変更されたものから先に並べたい場合には、 *jpg のところを $(ls -r -t *jpg) で置き換えてください。

そして実行してください:

  avconv -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

avconv が読み込むどの画像フォーマットでもこれと同じ方式が用いられます。

3.2 動画を別々の画像にエンコードするには?

次のようにします:

  avconv -i movie.mpg movie%d.jpg

この ‘movie.mpg’ が入力として用いられ、 ‘movie1.jpg’, ‘movie2.jpg’, ... などに変換されるでしょう。

ファイルフォーマットの自己認識に頼る代わりに、エンコーディングを強制するため

-c:v ppm
-c:v png
-c:v mjpeg

を使うことになるかもしれません。

これらを前の例に応用すると:

  avconv -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg

“jpeg” というコーデックはないことに注意してください。代わりに “mjpeg” を使ってください。

3.3 マルチスレデッド MPEG* エンコーディングだと少し品質が落ちるようですがなぜ?

マルチスレデッド MPEG* エンコーディングのため、エンコードされた断片はそれぞれ独立でなければなりませんが、 そうでなければスレッド n は実用的には n-1 が終わるまで待たなくてはなりません。 そのため品質の小さな低下があるのはごく論理的なことです。これはバグではありません。

3.4 標準入力から読み込む、または標準出力に書き出すには?

ファイル名として ‘-’ を使ってください。

3.5 ’-f jpeg’ がうまくいきません。

’-f image2 test%d.jpg’ を試してください。

3.6 フレームレートを変更できないのはなぜ?

コーデックの中には、MPEG-1/2 のように、少数の決まったフレームレートのみを許すものがあります。 -c:v コマンドラインオプションで別のコーデックを選んでください。

3.7 avconv で Xvid または DivX の映像にエンコードするには?

Xvid、DivX(バージョン 4+) どちらも ISO MPEG-4 標準の実装です (これと同じ標準を使った他の多くのコーディングフォーマットがあることに注意してください)。 したがって、これらのフォーマットにエンコードするためには ’-c:v mpeg4’ を使ってください。 MPEG-4 でコードされたファイルに格納される既定の fourcc は ’FMP4’ です。 異なる fourcc にしたい場合は、’-vtag’ オプションを使ってください。例えば、’-vtag xvid’ とすると video fourcc としてデフォルトの ’FMP4’ ではなく ’xvid’ が格納されるよう強制します。

3.8 高品質な MPEG-4 エンコーディングに向いているパラメーターは?

’-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2’, 試してみるべきもの: ’-bf 2’, ’-flags qprd’, ’-flags mv0’, ’-flags skiprd’。

3.9 高品質な MPEG-1/MPEG-2 エンコーディングに向いているパラメーターは?

’-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’ ですが ’-g 100’ はデコーダーによっては問題が生じるかもしれません。 試してみるべきもの: ’-bf 2’, ’-flags qprd’, ’-flags mv0’, ’-flags skiprd’。

3.10 avconv でエンコードするとインターレースされたビデオがとても粗悪ですが、何がおかしい?

インターレースされたデータには ’-flags +ilme+ildct’ を使うべきで、また ’-flags +alt’ も良いかもしれません。 さらに結果が本当にむちゃくちゃなら ’-top 0/1’ を試してください。

3.11 DirectShow ファイルを読むには?

Libav を ./configure --enable-avisynth としてビルドしている (MinGW/Cygwin プラットフォームでのみ可能性があります)なら、 DirectShow が読めるファイルならどれでも入力として使えます。

単に次の1行からなるテキストファイル “input.avs” を作成します:

  DirectShowSource("C:\path to your file\yourfile.asf")

... そして続いてこのテキストファイルを avconv にフィードします:

  avconv -i input.avs

Avisynth に関するこれ以外の一切のヘルプについては、 Avisynth のホームページ を訪ねてください。

3.12 ビデオファイルを結合するには?

単にファイルを結合するだけでビデオファイルをつなげることができるマルチメディア コンテナ(MPEG-1, MPEG-2 PS, DV)が少しだけあります。

したがってマルチメディアファイルを結合するには、まずそれらをこれら特権的なフォーマット にコード変換し、そして質素な cat コマンド(もしくは同じような Windows 上の質素な copy)を使い、最後に選んだフォーマットに変換し直すことです。

avconv -i input1.avi -same_quant intermediate1.mpg
avconv -i input2.avi -same_quant intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
avconv -i intermediate_all.mpg -same_quant output.avi

ビデオの品質を保ちたいときには、中間および出力ファイルのために -same_quant を使うか、適度に高いビットレートを指定するかするべきであることに注意して ください。

プラットフォームがサポートしているなら、名前付きパイプの利点を生かして 巨大な中間ファイルを避けることができることにも注意してください:

mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
avconv -i input1.avi -same_quant -y intermediate1.mpg < /dev/null &
avconv -i input2.avi -same_quant -y intermediate2.mpg < /dev/null &
cat intermediate1.mpg intermediate2.mpg |\
avconv -f mpeg -i - -same_quant -c:v mpeg4 -acodec libmp3lame output.avi

同様に、yuv4mpegpipe フォーマット、未加工ビデオ、および未加工オーディオコーデック もまた結合を許し、かつコード変換ステップがほとんどロスレスです。 複数の yuv4mpegpipe を使う際には、最初の行は最初のストリーム以外すべて 捨てる必要があります。これは、次に見るように、tailを通じてパイプする ことによって達成できます。tailを通じてパイプする際には 適切にバックグラウンドにするためコマンドのグループ化 { ;} を使わなければ ならないことに注意してください。

例えば、2つの FLV ファイルを1つの output.flv ファイルにつなげたいとします:

mkfifo temp1.a
mkfifo temp1.v
mkfifo temp2.a
mkfifo temp2.v
mkfifo all.a
mkfifo all.v
avconv -i input1.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
avconv -i input2.flv -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
avconv -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
{ avconv -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } &
cat temp1.a temp2.a > all.a &
cat temp1.v temp2.v > all.v &
avconv -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \
       -f yuv4mpegpipe -i all.v \
       -same_quant -y output.flv
rm temp[12].[av] all.[av]

3.13 AAC 音声で H.264 にエンコーディングすると -profile オプションが失敗します

avconv は次のようなエラーを出力します

Undefined constant or missing '(' in 'baseline'
Unable to parse option value "baseline"
Error setting option profile to value baseline.

短い答え: ‘-profile’ の代わりに ‘-profile:v’ としてください。

長い答え: これは ‘-profile’ が映像にも音声にも適用されることがあるため 起こります。特に AAC エンコーダーはいくつかのプロファイルを定義しており、それらは どれも baseline という名前ではありません。

解決方法は、Stream specifiers を使って ‘-profile’ オプションを映像ストリームだけに適用することです。 それに :v を付け加えるとちょうどそうなります。

4 開発

4.1 Libav のライブラリ、特に libavcodec や libavformat を使う方法を示している例はある?

はい。Libav のドキュメントの the Developers Guide を読んでください。あるいは、 (http://ffmpeg.mplayerhq.hu/projects.html) にある Libav を既に組み入れている 多くのオープンソースプロジェクトのソースコードを調べてみてください。

4.2 C コンパイラ XXX をサポートしたら?

場合によります。もしそのコンパイラが C99 準拠であれば、 そのコンパイラに関係した #ifdef でソースコードを汚さないかぎり それをサポートするパッチは歓迎される見込みがあります。

4.3 Microsoft Visual C++ はサポートされてる?

はい。Libav ドキュメンテーションの Microsoft Visual C++ の セクションを見てください。

4.4 Windows で Libav は使える?

はい、しかし Libav をコンパイルするのには 必ず Cygwin または MinGW ツールを使わなければなりません。 さらなる情報を見つけるには Libav のドキュメントの Windows の節を読んでください。

4.5 automake や libtool、autoconf のサポートを加えてみたら?

いいえ。これらのツールは膨らみ過ぎで、ビルドを複雑にします。

4.6 Libav をオブジェクト指向の C++ で書き直したら?

Libav は既に高いモジュール構成からなる方式で組織化されており、フォーマルなオブジェクト言語で 書き直す必要はありません。さらに、開発者の多くが純粋な C を好んでいます; 彼らにはそれでうまくいくのです。この題材についてさらなる議論をするには "Programming Religion" を読んでください。

4.7 LGPL が好きでありません、代わりに GPL でコードを寄付してもいい?

はい、そのコードがオプションであり、簡単かつきれいに何も壊すことなく #if CONFIG_GPL で配置される限りは。 ですので、例えば新しいコーデックやフィルターは GPL でよいですが LGPL のコードへのバグ修正ならよくありません。

4.8 C++ アプリケーション内で libav を使っているのですが、リンカが利用可能に見えるのに見つからないシンボルについて文句を言います。

Libav は純粋な C のプロジェクトですので, そのライブラリを C++ アプリケーション内で使うには、 C のライブラリを使うと明示的に述べる必要があります。これは Libav の include を extern "C" で 取り囲むことによってできます。

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3 を見てください。

4.9 libavutil を C++ アプリケーションから使っていますが、’UINT64_C’ がこのスコープで宣言されていないとコンパイラが文句を言います

Libav は C99 math 機能を使った C プロジェクトで、C++ でそれらを使えるように するには CXXFLAGS に -D__STDC_CONSTANT_MACROS を追加しなければなりません。

4.10 メモリ上にあるファイル、もしくは *open/*read/ libc とは異なる API があります。libavformat でそれを使うには?

URLProtocol を実装しなければなりません。 Libav の ‘libavformat/file.c’ や Mpalyer のソースの ‘libmpdemux/demux_lavf.c’ を見てください。

4.11 なぜ make fate は全てのテストを実行しないのですか?

fate スイートのサンプルがあり、その正しいパスを SAMPLES という Make での変数、 または FATE_SAMPLES という環境変数、または --samples という configure のオプションで設定しているかどうか確かめてください。

4.12 なぜ make fate はこのサンプルを見つけないのですか?

サンプルのパスの中に home ディレクトリを示す文字 ~ がありませんか? シェルがこれを展開できないところで使われているので、FATE はファイルを見つけられません。 ~ をそのフルパスで置き換えてください。