simotin13's message

simotin13といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

FFmpegのコードを読み始めた

自分向けの備忘録です。

ソースコードの入手とビルド

ソースコードの入手

githubにミラーされているのでclone
github.com

ビルド方法

Ubuntu上で作業をしているので以下のページを参照します。
trac.ffmpeg.org

aptで色々と入れる必要はあります。

sudo apt update
sudo apt install nasm yasm libx264-dev libnuma-dev libx265-dev libvpx-dev libfdk-aac-dev libopus-dev libaom-dev autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev meson ninja-build pkg-config texinfo wget libunistring-dev libsvtav1enc-dev libvorbis-dev

私の環境では依存関係の問題などが出ましたがとりあえず以下の./configureが通るようになりました。

./configure --prefix="$HOME/ffmpeg_build" --pkg-config-flags="--static" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --ld="g++" --bindir="$HOME/bin" --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libsvtav1 --enable-libdav1d --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree

./configureが通れば makeコマンドを叩くだけですんなりビルドできました。

mp4のフォーマットに関する部分を知りたい

自分が作っているRTSPのクライアントではH.264の動画を.mp4のファイルに保存する(録画)機能を実装しようとしています。
H.264AACのパケットを受信するところまではできるようになったのですが、mp4のフォーマットをどのように出力するのかがよく分かっていません。

mp4にはアトムやボックスと呼ばれるデータ構造の単位がありこのデータ構造に動画や音声のデータを入れたり、動画の再生などで必要となるメタデータを入れる必要があります。
どのようなボックスにどういったデータがあるのかはある程度理解できてきたのですが、細部については不明な点が多いので理解のためにFFmpegのコードを読むことにしました。

libavformatを読む

FFMpegはマルチメディア処理に関連するいくつかのモジュール群から構成されています。
私が知りたいのはmp4のデータフォーマットの書き込み(エンコード)方法なのですが、これは libavformat というディレクトリ以下で実装されています。
mp4のボックスに関するコードは moven.cで主に実装されていました。

例えば mp4のファイルの先頭にはftypというメタデータ用のボックスが格納される必要がありますが、これは mov_write_ftyp_tag という関数で実装されています。
ファイルへの書き込み処理はメインスレッドとは別スレッドで行われます。

とりあえずどの辺で書き込みが実装されているかは把握できたので続きは別の日にします。