⚠️ これは 非公式の翻訳サイトです。FFmpeg プロジェクトとは無関係です。正確な情報は 原文(https://ffmpeg.org/faq.html) を参照してください。

FFmpeg FAQ(よくある質問)

1 一般的な質問

1.1 なぜ FFmpeg は機能 [xyz] に対応していないのですか?

まだ誰もその作業に取り組んでいないからです。FFmpeg の開発は、個々の開発者にとって重要な作業によって進められます。あなたにとって重要な機能があるなら、実装してもらう一番の近道は、自分でその作業を引き受けるか、開発者にスポンサーとして資金を出すことです。

1.2 FFmpeg は codec XXX に対応していません。対応のために Windows DLL ローダーを組み込んでもらえませんか?

いいえ。Windows の DLL は移植性がなく、肥大化していて、遅いことも多いからです。さらに FFmpeg は、すべての codec をネイティブに対応することを目指しています。DLL ローダーはその目標にそぐいません。

1.3 このフォーマットは ffmpeg が対応しているはずなのに、ファイルを読み込めません。

ffmpeg がコンテナフォーマットを読めても、そこに含まれるすべての codec に対応しているとは限りません。ffmpeg のドキュメントにある対応 codec の一覧を確認してください。

1.4 Windows ではどの codec に対応していますか?

Windows は、追加の codec をいくつかインストールしない限り、MPEG のような標準的なフォーマットをうまく扱えません。

次の映像 codec の一覧は、ほとんどの Windows システムで動作するはずです。

msmpeg4v2

.avi/.asf

msmpeg4

.asf のみ

wmv1

.asf のみ

wmv2

.asf のみ

mpeg4

ffdshow や Xvid などの MPEG-4 codec がインストールされている場合のみ。

mpeg1video

.mpg のみ

なお、Windows では ASF ファイルに .wmv や .wma という拡張子が付いていることがよくあります。また、Microsoft は ASF フォーマットに特許を主張しており、Microsoft 製以外のソフトウェアで ASF ファイルを作成したユーザーを提訴したり威嚇したりする可能性がある点にも触れておきます。可能な限り ASF は避けることを強くおすすめします。

次の音声 codec の一覧は、ほとんどの Windows システムで動作するはずです。

adpcm_ima_wav adpcm_ms pcm_s16le

常に利用可能

libmp3lame

LAME などの MP3 codec がインストールされている場合。

2 コンパイル

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

これは gcc のバグです。私たちには報告しないでください。代わりに gcc の開発者へ報告してください。なお、私たちは gcc のバグに対する回避策を追加しません。

また、gcc の開発者の(一部の)人たちは、これはバグではない、あるいは自分たちが直すべきバグではないと考えていることも知っておいてください: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203。もっとも、彼らの中には決定不能問題と NP 困難問題の違いを分かっていない人もいますが…。

2.2 ディストリビューションのパッケージマネージャーでこのライブラリをインストールしました。なぜ configure はそれを認識しないのですか?

ディストリビューションは通常、ライブラリを複数のパッケージに分割しています。メインパッケージには、そのライブラリを使うプログラムを実行するために必要なファイルが含まれます。開発パッケージには、そのライブラリを使うプログラムをビルドするために必要なファイルが含まれます。ドキュメントやデータがさらに別のパッケージに分かれていることもあります。

FFmpeg をビルドするには、開発パッケージをインストールする必要があります。たいていは libfoo-dev や libfoo-devel という名前です。ビルドが終われば削除してかまいませんが、メインパッケージは必ず残してください。

2.3 pkg-config に自分のライブラリを見つけさせるには?

ライブラリのどこかには、pkgconfig ディレクトリ内に .pc ファイルが 1 つ(あるいは複数)あります。pkg-config をこれらのファイルへ向けるには、環境変数を設定する必要があります。

pkg-config の検索リストにディレクトリを 追加 したい場合(典型例: ライブラリを別途インストールしたとき)は、$PKG_CONFIG_PATH に追加します。

export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig

pkg-config の検索リストを 置き換え たい場合(典型例: クロスコンパイル)は、$PKG_CONFIG_LIBDIR に設定します。

export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig

ライブラリの内部依存関係を知る必要がある場合(典型例: 静的リンク)は、pkg-config に --static オプションを付けます。

./configure --pkg-config-flags=--static

2.4 クロスコンパイル時に pkg-config を使うには?

一番よいのは、クロスコンパイル環境に pkg-config をインストールすることです。そうすれば自動的にクロスコンパイル用のライブラリを使います。

ホスト環境の pkg-config を使うこともできます。その場合は configure に --pkg-config=pkg-config を明示的に指定します。このときは前の項目で説明したとおり、PKG_CONFIG_LIBDIR を使って pkg-config を正しいディレクトリへ向ける必要があります。

中間的な方法として、PKG_CONFIG_LIBDIR を設定したうえでホストの pkg-config を呼び出すスクリプトを、クロスコンパイル環境に置く手もあります。スクリプトは次のようになります。

#!/bin/sh
PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
export PKG_CONFIG_LIBDIR
exec /usr/bin/pkg-config "$@"

3 使い方

3.1 ffmpeg が動きません。何がいけないのでしょう?

ビルドの前に、ffmpeg のソースディレクトリで make distclean を試してください。それでも解決しない場合は(https://ffmpeg.org/bugreports.html)を参照してください。

3.2 連番の静止画から動画を作るには?

まず、画像のファイル名を連番に付け替えます。たとえば img1.jpg, img2.jpg, img3.jpg, … のようにします。そのうえで次を実行します。

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

‘%d’ が画像の番号に置き換わる点に注意してください。

img%03d.jpg は img001.jpg, img002.jpg, … という連番を表します。

連番の開始番号を指定するには -start_number オプションを使います。連番が img001.jpg からではないものの、数の順序にはなっている場合に便利です。次の例は img100.jpg から始めます。

ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg

付け替える画像が大量にある場合は、次のコマンドで手間を減らせます。このコマンドは bourne シェルの構文で、カレントディレクトリ内の *jpg に一致するすべてのファイルを、img001.jpg, img002.jpg … という連番で /tmp ディレクトリにシンボリックリンクします。

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) を使います。

そして次を実行します。

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

ffmpeg が読み込めるどの画像フォーマットでも同じ理屈が使えます。

cat で画像を ffmpeg にパイプすることもできます。

cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg

3.3 動画を連番の静止画にするには?

次を使います。

ffmpeg -i movie.mpg movie%d.jpg

入力に使った movie.mpg は movie1.jpg, movie2.jpg, … へ変換されます。

ファイルフォーマットの自動認識に頼らず、次のいずれかを使って

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

エンコードを明示することもできます。

これを先ほどの例に当てはめると次のようになります。

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

「jpeg」という codec は存在しない点に注意してください。代わりに「mjpeg」を使います。

3.4 マルチスレッドの MPEG* エンコードで画質がわずかに落ちるのはなぜですか?

マルチスレッドの MPEG* エンコードでは、エンコードされる各スライスが互いに独立している必要があります。さもないとスレッド n は事実上スレッド n-1 の完了を待たなければならなくなります。ですから画質がわずかに低下するのは、ごく自然なことです。これはバグではありません。

3.5 標準入力から読み込んだり、標準出力へ書き出したりするには?

ファイル名として - を使います。

3.6 -f jpeg が動きません。

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

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

MPEG-1/2 のような一部の codec は、限られた固定のフレームレートしか許しません。-c:v コマンドラインオプションで別の codec を選んでください。

3.8 ffmpeg で Xvid や DivX の映像をエンコードするには?

Xvid と DivX(バージョン 4 以降)は、どちらも ISO MPEG-4 規格の実装です(同じ規格を使う符号化フォーマットは他にも数多くある点に注意してください)。したがって、これらのフォーマットでエンコードするには ’-c:v mpeg4’ を使います。MPEG-4 で符号化したファイルに記録される既定の fourcc は ’FMP4’ です。別の fourcc にしたい場合は ’-vtag’ オプションを使います。たとえば ’-vtag xvid’ とすると、既定値ではなく ’xvid’ という fourcc が映像の fourcc として記録されます。

3.9 高画質な MPEG-4 をエンコードするのに適したパラメータは?

’-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2’。試す価値があるもの: ’-bf 2’、’-mpv_flags qp_rd’、’-mpv_flags mv0’、’-mpv_flags skip_rd’。

3.10 高画質な MPEG-1/MPEG-2 をエンコードするのに適したパラメータは?

’-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’。ただし ’-g 100’ は一部の decoder で問題を起こすことがある点に注意してください。試す価値があるもの: ’-bf 2’、’-mpv_flags qp_rd’、’-mpv_flags mv0’、’-mpv_flags skip_rd’。

3.11 ffmpeg でエンコードするとインターレース映像がひどく崩れます。何がいけないのでしょう?

インターレース素材には ’-flags +ilme+ildct’ を、必要なら ’-flags +alt’ も使ってください。結果がひどく乱れる場合は ’-top 0/1’ を試してください。

3.12 DirectShow のファイルを読み込むには?

./configure --enable-avisynth を付けて FFmpeg をビルドしている場合(MinGW/Cygwin プラットフォームでのみ可能)は、DirectShow が読める任意のファイルを入力に使えます。

次の 1 行だけを書いた「input.avs」というテキストファイルを作り…

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

…そのテキストファイルを ffmpeg に渡します。

ffmpeg -i input.avs

AviSynth に関するその他の手助けは、AviSynth のホームページ を参照してください。

3.13 動画ファイルを結合するには?

動画ファイルを「結合する(join)」と言っても、その意味はかなり曖昧です。次の一覧では、「結合」のさまざまな種類と、それぞれを FFmpeg でどう扱うかを説明します。動画ファイルの結合には、次のような意味がありえます。

  • 次々につなげる: これは 連結する(concatenate、略して concat)と呼ばれ、まさにこの FAQ で扱っています。
  • 同じファイルにまとめ、利用者が複数のバージョンから選べるようにする(例: 音声の言語が異なる): これは 多重化する(multiplex、略して mux)と呼ばれ、ffmpeg を複数の -i オプションで呼び出すだけで行えます。
  • 音声で、すべてのチャンネルを 1 つのストリームにまとめる(例: 2 つのモノラルストリームを 1 つのステレオストリームに): これは マージする(merge)と呼ばれることがあり、amerge フィルタで行えます。
  • 音声で、一方をもう一方に重ねて鳴らす: これは ミックスする(mix)と呼ばれ、まず 1 つのストリームにマージしてから、pan フィルタで好きなようにチャンネルを混ぜることで行えます。
  • 映像で、両方を一緒に表示する(横並びにする、あるいは一方を他方の一部に重ねる): overlay 映像フィルタで行えます。

3.14 動画ファイルを連結するには?

状況によっていくつかの方法があります。

3.14.1 concat フィルタ を使った連結

FFmpeg には、まさにそのための concat フィルタがあり、ドキュメントに例が載っています。再エンコードが必要な場合はこの方法を推奨します。

3.14.2 concat demuxer を使った連結

FFmpeg には concat demuxer があり、再エンコードを避けたいが、使っているフォーマットがファイルレベルの連結に対応していない場合に使えます。

3.14.3 concat プロトコル を使った連結(ファイルレベル)

FFmpeg には、まさにそのための concat プロトコルがあり、ドキュメントに例が載っています。

一部のマルチメディアコンテナ(MPEG-1, MPEG-2 PS, DV)は、それを含むファイルを単純につなげるだけで動画を連結できます。

そこで、まずこれらの都合のよいフォーマットへトランスコードし、次に素朴な cat コマンド(Windows なら同じく素朴な copy)を使い、最後に好きなフォーマットへトランスコードし直すことで、マルチメディアファイルを連結できます。

ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

さらに、cat や copy の代わりに concat プロトコルを使えば、巨大になりかねない中間ファイルの作成を避けられます。

ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

多くのシェルで特別な意味を持つ文字「|」は、エスケープが必要になる場合がある点に注意してください。

プラットフォームが対応していれば、名前付きパイプを使う手もあります。

mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
cat intermediate1.mpg intermediate2.mpg |\
ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi

3.14.4 raw の音声・映像を使った連結

同様に、yuv4mpegpipe フォーマットや raw video・raw audio の codec も連結に対応しており、トランスコードの工程はほぼ可逆(ロスレス)です。複数の yuv4mpegpipe を使う場合、最初のストリーム以外はすべて先頭行を捨てる必要があります。これは下記のように tail へパイプすることで実現できます。なお、tail へパイプするときは、正しくバックグラウンド実行するためにコマンドのグループ化 { ;} を使う必要があります。

たとえば、2 つの FLV ファイルを output.flv に連結したいとします。

mkfifo temp1.a
mkfifo temp1.v
mkfifo temp2.a
mkfifo temp2.v
mkfifo all.a
mkfifo all.v
ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
{ ffmpeg -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 &
ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
       -f yuv4mpegpipe -i all.v \
       -y output.flv
rm temp[12].[av] all.[av]

3.15 -f lavfi を使うと、理由もなく音声がモノラルになります。

チャンネルレイアウトがどこで失われるかを正確に突き止めるには -dumpgraph - を使います。

おそらく auto-inserted aresample が原因です。その箇所でなぜ変換フィルタが必要になったのかを考えてみてください。

-f lavfi は現状 packed S16 にしか対応していないため、出力の直前がその可能性の高い箇所です。

そのうえで、正確なフォーマットを指定した正しい aformat を filtergraph に明示的に挿入します。

aformat=sample_fmts=s16:channel_layouts=stereo

3.16 FFmpeg が VOB ファイルの字幕を認識しないのはなぜですか?

VOB やその他いくつかのフォーマットには、ファイル内のすべてを記述するグローバルヘッダーがありません。その代わり、アプリケーション側がファイルをスキャンして中身を確かめる前提になっています。VOB ファイルはたいてい大きいため、先頭部分しかスキャンされません。字幕がファイルの後半にしか現れない場合、最初の段階では検出されません。

ffmpeg コマンドラインツールを含む一部のアプリケーションは、最初のスキャンで検出されたストリームしか扱えず、後から検出されるストリームは無視します。

最初のスキャンのサイズは、2 つのオプションで制御します: probesize(既定値 約 5 MB)と analyzeduration(既定値 5,000,000 µs = 5 s)です。字幕ストリームを検出させるには、どちらの値も十分に大きくする必要があります。

3.17 ffmpeg の -sameq オプションはなぜ削除されたのですか? 代わりに何を使えばよいですか?

-sameq オプションは「same quantizer(同じ量子化器)」を意味し、ごく限られた場合にしか意味を持ちませんでした。残念ながら、多くの人がこれを「same quality(同じ画質)」と勘違いし、意味のない場面で使っていました。見た目はおおむね期待どおりの効果になりますが、その実現の仕方は非常に非効率でした。

各 encoder には、画質とサイズのバランスを設定するための独自のオプションがあります。使っている encoder のオプションを使い、自分の好みに合う画質に設定してください。そのためによく使われるのは -qscale と -qmax ですが、選んだ encoder のドキュメントをよく読むべきです。

3.18 映像が引き伸ばされています。スケーリングで直らないのはなぜですか?

多くの映像 codec やフォーマットは、映像の アスペクト比 を記録できます。これは、画像全体の幅と高さの比(DAR、display aspect ratio)、または個々のピクセルの幅と高さの比(SAR、sample aspect ratio)です。たとえば、解像度 640×350 の EGA 画面は DAR が 4:3、SAR が 35:48 でした。

ほとんどの静止画処理は正方形のピクセル、つまり 1:1 の SAR を前提にしていますが、多くの映像規格、とくにアナログからデジタルへの移行期のものは、正方形でないピクセルを使います。

FFmpeg のほとんどの処理フィルタは、画像が引き伸ばされないようアスペクト比を扱います。クロップは SAR を一定に保つよう DAR を調整し、スケーリングは DAR を一定に保つよう SAR を調整します。

画像を引き伸ばしたい、あるいは引き伸ばしを「元に戻したい」場合は、setdar or setsar filters でその情報を上書きする必要があります。

引き伸ばしが画像そのものに由来するのか、アスペクト比の情報に由来するのかを確かめるため、元の映像を注意深く調べることを忘れないでください。

たとえば、まずく(badly)エンコードされた EGA キャプチャを直すには、次のコマンドを使います。1 つ目は正方形ピクセルへ拡大するもの、2 つ目は正しいアスペクト比を設定するもの、3 つ目はトランスコードを避けるもの(フォーマットや codec、プレーヤー、さらにはその日の運次第でうまくいかないこともあります)です。

ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut

3.19 ffmpeg をバックグラウンドタスクとして実行するには?

ffmpeg は処理中、停止用の「q」やヘルプ表示用の「?」といった入力がないか、通常はコンソール入力を確認します。ffmpeg には、自分がバックグラウンドタスクとして動いているかどうかを検知する手段がありません。コンソール入力を確認すると、バックグラウンドで ffmpeg を実行しているプロセスが停止(サスペンド)してしまうことがあります。

こうした入力確認を防ぎ、ffmpeg をバックグラウンドタスクとして実行できるようにするには、ffmpeg の呼び出しで -nostdin オプションを使います。これは、シェルで ffmpeg を実行する場合でも、OS の API を介して ffmpeg を独立したプロセスとして起動する場合でも有効です。

別の方法として、シェルで ffmpeg を実行している場合は、標準入力を /dev/null(Linux と macOS)や NUL(Windows)へリダイレクトできます。このリダイレクトは、ffmpeg の呼び出し時に行っても、ffmpeg を呼ぶシェルスクリプトの側で行ってもかまいません。

たとえば次のようにします。

ffmpeg -nostdin -i INPUT OUTPUT

あるいは(Linux、macOS、その他の UNIX 系シェルでは)次のようにします。

ffmpeg -i INPUT OUTPUT </dev/null

あるいは(Windows では)次のようにします。

ffmpeg -i INPUT OUTPUT <NUL

3.20 suspended (tty output) のようなメッセージで ffmpeg が停止しないようにするには?

ffmpeg をバックグラウンドで実行すると、そのプロセスが停止することがあります。suspended (tty output) のようなメッセージが出る場合もあります。問題は、プロセスが停止しないようにする方法です。

たとえば次のようになります。

% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt &
[1] 93352
%
[1]  + suspended (tty output)  ffmpeg -i INPUT OUTPUT &>

メッセージは「tty output」となっていますが、ここでの本当の問題は、ffmpeg が実行時に通常コンソール入力を確認することです。OS がこれを検知し、フォアグラウンドに戻して対応できるようになるまでプロセスを停止させます。

解決策は、コンソール入力を参照しないよう ffmpeg に正しく伝える手法を使うことです。-nostdin オプションを使うか、< /dev/null で標準入力をリダイレクトします。詳しくは FAQ の ffmpeg をバックグラウンドタスクとして実行するには? を参照してください。

4 開発

4.1 FFmpeg のライブラリ、とくに libavcodec と libavformat の使い方を示すサンプルはありますか?

あります。ソースリポジトリの doc/examples ディレクトリを確認してください。オンラインでも次の場所で見られます: https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples。

サンプルは既定でインストールもされ、通常は $PREFIX/share/ffmpeg/examples に置かれます。

また、FFmpeg ドキュメントの Developers Guide を読むのもよいでしょう。あるいは、すでに FFmpeg を取り込んでいる数多くのオープンソースプロジェクト(projects.html)のいずれかのソースコードを調べてみてください。

4.2 私の C コンパイラ XXX に対応してもらえますか?

場合によります。あなたのコンパイラが C99 準拠であれば、コンパイラ固有の #ifdef でソースコードを汚さない限り、対応のためのパッチは歓迎される可能性が高いです。

4.3 Microsoft Visual C++ には対応していますか?

はい。FFmpeg ドキュメントの Microsoft Visual C++ のセクションを参照してください。

4.4 automake、libtool、autoconf への対応を追加してもらえますか?

いいえ。これらのツールは肥大化しすぎていて、ビルドを複雑にするからです。

4.5 FFmpeg をオブジェクト指向の C++ で書き直さないのはなぜですか?

FFmpeg はすでに高度にモジュール化された構成になっており、形式的なオブジェクト指向言語で書き直す必要はありません。さらに、多くの開発者は素の C を好んでいて、それで十分にうまくいっています。この件についてのさらなる議論は、"Programming Religion" を読んでください。

4.6 ffmpeg のプログラムにデバッグシンボルがないのはなぜですか?

ビルド処理では、完全なデバッグ情報を含む ffmpeg_g、ffplay_g などが作られます。これらのバイナリから情報を取り除いて(strip して)ffmpeg、ffplay などが作られます。デバッグ情報が必要な場合は *_g 版を使ってください。

4.7 LGPL が好きではないのですが、代わりに GPL でコードを提供してもよいですか?

はい。そのコードが任意機能であり、何も壊さずに #if CONFIG_GPL の下へきれいに収められる限りは可能です。たとえば、新しい codec やフィルタなら GPL で問題ありませんが、LGPL のコードへのバグ修正はそうはいきません。

4.8 自分の C アプリケーションから FFmpeg を使っているのですが、リンカがライブラリ自体のシンボルが見つからないと文句を言います。

FFmpeg は既定で静的ライブラリをビルドします。静的ライブラリでは依存関係が解決されません。これには 2 つの帰結があります。1 つ目は、ライブラリを依存順に指定しなければならないことです。-lavdevice は -lavformat より前に、-lavutil は他のすべてより後に置く、といった具合です。2 つ目は、FFmpeg で使われている外部ライブラリも指定しなければならないことです。

必要なライブラリの完全な一覧を依存順に得るには、pkg-config を使うのが簡単です。

c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)

詳しくは doc/example/Makefile と doc/example/pc-uninstalled を参照してください。

4.9 自分の C++ アプリケーションから FFmpeg を使っているのですが、存在しているはずのシンボルが見つからないとリンカが文句を言います。

FFmpeg は純粋な C のプロジェクトなので、C++ アプリケーションでライブラリを使うには、C のライブラリを使っていることを明示する必要があります。FFmpeg の include を extern "C" で囲むことで対応できます。

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

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

FFmpeg は C99 の数学機能を使う純粋な C のプロジェクトです。C++ でそれらを使えるようにするには、CXXFLAGS に -D__STDC_CONSTANT_MACROS を追加する必要があります。

4.11 メモリ上のファイルや、open/read/ libc とは異なる API を持っています。これを libavformat で使うには?

avio_alloc_context を使ってカスタムの AVIOContext を作る必要があります。FFmpeg の libavformat/aviobuf.c や、MPlayer・MPlayer2 のソースにある libmpdemux/demux_lavf.c を参照してください。

4.12 ffv1、msmpeg4、asv1、4xm についてのドキュメントはどこにありますか?

https://www.ffmpeg.org/~michael/ を参照してください。

4.13 H.263-RTP(やその他 RTP に載った codec)を libavcodec に渡すには?

ネットワーク向けという点で特殊ではありますが、RTP も他と変わらないコンテナです。payload を libavcodec に渡す前に、RTP を demux する必要があります。この具体的なケースについては、どう行うべきか RFC 4629 を参照してください。

4.14 AVStream.r_frame_rate がおかしく、フレームレートよりずっと大きい値になっています。

r_frame_rate は平均のフレームレート ではなく、すべてのタイムスタンプを正確に表現できる最小のフレームレートです。ですから、平均より大きくてもおかしくはありません。たとえば 25 fps と 30 fps のコンテンツが混在している場合、r_frame_rate は 150(最小公倍数)になります。平均のフレームレートが知りたい場合は、AVStream.avg_frame_rate を参照してください。

4.15 make fate がすべてのテストを実行しないのはなぜですか?

fate-suite のサンプルがそろっているか、そして SAMPLES という Make 変数、FATE_SAMPLES 環境変数、または configure の --samples オプションのいずれかが正しいパスに設定されているかを確認してください。

4.16 make fate がサンプルを見つけられないのはなぜですか?

サンプルのパスに、ホームディレクトリを表す ~ 文字が含まれていませんか? この値はシェルが展開できない形で使われるため、FATE がファイルを見つけられなくなります。~ をフルパスに置き換えてください。

ホスティング提供: telepoint.bg