FFmpeg APIの情報源
FFmpeg APIの情報源は限られています。FFmpeg APIを利用したコーディングで困った時には、FFmpegのソースを参考にするのが1番手っ取り早い方法です。
ffmpeg.c
ffmpegコマンドのソースです。FFmpeg APIの使い方のほぼすべてがこの部分に詰まっています。特に、次の関数が参考になるでしょう。
av_encode
動画変換のメインループを含む関数です。入出力ファイルの初期化や、2-PASSモードの処理などがここに含まれます。パケットの読み込みまでをここで行っています。
output_packet
av_encodeより呼ばれます。読み込んだパケットを1つ受け取り、avcodec_decode_videoを利用してフレームを復号するところまでを行います。
do_video_out、do_audio_out
output_packetより呼ばれます。復号されたデータを受け取り、avcodec_encode_videoを利用し、出力フォーマットに併せて符号化してパケットを作成します。動画のサイズ変更やPTSの同期処理なども行っています。
write_frame
do_video_outやdo_audio_out等から呼ばれます。パケットを受け取り、書き込み処理を行います。書き出す直前に、-vbsfや-absfなどのオプションで指定できるbitstream filterの処理が行われています。
ffplay.c
ffmpegとSDLを利用した動画プレイヤーです。動画の読み込みとスレッドの扱い方、音声と画像の同期の取り方を知りたい時に大変役に立つソースです。
output_example.c
動画を吐き出すサンプルです。書き出し部分だけがコンパクトにまとまっているソースなので、ffmpeg.cが複雑過ぎてわからない時に参考にすると良いでしょう。
なお、このソースではパケットの書き出しに、av_interleaved_write_frameの代わりにav_write_frameを利用しています。正確な順序でパケットを送り出せる場合は、こちらの方がパフォーマンスがよくなるそうです。
libavformat/avformat.h、libavcodec/avcodec.h 等ヘッダファイル
ヘッダファイルの関数宣言には、doxygen方式で関数コメントが書かれています。引数や戻り値、関数の概要などを調べたい時に便利です。
Doxygenがインストールされている場合、FFmpegのソースツリーのrootでdoxygenコマンドを実行すると、doxyディレクトリの下にHTMLドキュメントが吐き出されます。
まとめ
本稿では、動画処理の後編として以下の内容について説明しました。
- 動画を書き込むのに必要な手続き
- FFmpegのソースのアウトライン
FFmpegと言えばその強力なフォーマット変換機能にばかり目が行ってしまいがちですが、多数のコーデックが揃っており、種々の動画ファイルを自在に操れるAPIこそ未知なる可能性を秘めている部分だと思います。この記事をきっかけに、動画を自在に扱い、誰も想像しなかったようなサービスを開拓するユーザーが現れてくれることを楽しみに待っております。
参考文献
- 『FFmpegで作る動画共有サイト』(月村潤・本間雅洋・堀田直孝・原一浩・足立健誌・尾花衣美・堀内康弘・寺田学 著、毎日コミュニケーションズ、2008年1月)
- 『An FFmpeg and SDL Tutorial』
- 『技術開発【MPEG技術解説】』(パイオニア株式会社)

