ffmpeg のコンパイルとパラメータの解釈を理解する

学習記事:https://ffmpeg.xianwaizhiyin.net/build-ffmpeg/configure-args.html

ソースコード

いくつかのドキュメントを削除した後

~/ffmpeg-4.2.2 $ ls
compat     fftools      libavformat    libswresample  presets
configure  libavcodec   libavresample  libswscale     tests
doc        libavdevice  libavutil      Makefile       tools
ffbuild    libavfilter  libpostproc    
 

doc/build_system.txt、FFmpeg のコンパイルに関するチュートリアル。

doc/filter_design.txt 、フィルター filter の設計原則。

doc/writing_filters.txt、フィルターを作成して FFmpeg に追加する方法。

doc/issue_tracker.txt、FFmpeg のバグまたは機能の追跡プロセス

doc/multithreading.txt、FFmpeg にはスライス スレッディングとフレーム スレッディングの 2 種類のマルチスレッドがあります。

doc/optimization.txt のコーデック最適化メソッド、FFmpeg にもアセンブリ SIMD によって最適化できる機能がいくつかありますが、その機能の一部が不明瞭に最適化されている場合は、初期の gitlog を確認できます。

doc/rate_distortion.txt、歪み率の簡単な説明。

コンパイルパラメータ

環境ディレクトリ

prefix はプレフィックス ディレクトリを表します

libdir は静的ライブラリのディレクトリを表します

shlibdir はダイナミック ライブラリのインストール ディレクトリです。デフォルトでは、ダイナミック ライブラリはシステムのダイナミック ライブラリ ディレクトリにインストールされます。

pkgconfigdir は、pkg ファイルのインストール ディレクトリを表します。

pkg は、サードパーティ ソフトウェアの FFmpeg 静的ライブラリと動的ライブラリのインストール ディレクトリを見つけるために使用されます。

リンクライブラリ

--disable-static\ --enable-shared 、FFmpeg はデフォルトで静的ライブラリを生成します

--extra-cflags、フラグ オプションを C コンパイラに渡します

--extra-cxxflags、フラグ オプションを C++ コンパイラに渡します。

--extra-ldflags、フラグ オプションを LD リンカーに渡します

--extra-ldexeflags、exe 生成時にリンカーに渡されるオプション

--extra-ldsoflags、動的ライブラリの生成時にリンカーに渡されるオプション

--extra-libs は追加のライブラリを指定し、実際にはリンカーにオプションを追加します。

--env="ENV=override" これは最も重要で、環境変数をオーバーライドできます。

コンパイル速度、プログラムサイズ

--enable-small、FFmpeg のサイズを削減します。

--disable-doc を指定すると、ドキュメントのコンパイルと生成が行われなくなります。これにより、コンパイル時間を節約できます。

--disable-programs、実行可能ファイル (ffmpeg) を有効/無効にします。1 つに対して --disable-ffplay を生成しないでください。すべてを閉じた場合、静的ライブラリ/動的ライブラリのみが生成されます。

--disable-avdevice、--disable-avcodec、--disable-avformat、--disable-swresample、--disable-swscale、--disable-postproc、--disable-avfilter。オープン/クローズドライブラリ、実行可能ファイルのみが必要な場合、これらのライブラリを生成しないように指定できますが、プログラムによっては特定のライブラリの機能が不足している場合があります。(フィルター モジュールを開発するときに、一部のライブラリを手動で閉じることができます。これにより、コンパイル時間が大幅に短縮されます)

--disable-indevs --disable-outdevs --disable-bsfs --disable-protocols --disable-filters --disable-encoders --disable-decoders --disable-muxers --disable-demuxers --disable-parsersこれら 10 個の対応するデバイスについては、主にコード サイズを削減するために、まずそれらをすべて閉じてから、必要なものを解放します。その後の設定がない場合、ffmpeg は最小のボリュームでコンパイルされますが、関数は何も含まれません。

デフォルトのコンパイルでは、ffmpeg.exe に多くのエンコーダ/デコーダおよびデマルチプレクサが追加されるため、この方法を使用してプログラムを小さくし、組み込みデバイスまたはゼロタイム開発でコンパイルを高速化できます。他のフィルターやプロトコルもこのように切り取ることができます。

実行可能プログラムのプロパティ

--disable-pthreads、--disable-w32threads、--disable-os2threads マルチスレッドをオフにします。無効にするとパフォーマンスが大幅に低下します

--disable-network 。ネットワーク プロトコルを処理する必要がない場合は、このオプションを有効にできます。これにより、ソフトウェアのサイズが削減され、コンパイル時間が節約されます。

エンコーダ

--enable-libx264、h.264 のコーデックとして x264 を有効にします。--enable-libx265、h.265 のコーデックとして x265 を有効にします。(今は通常この2つですが、以前はh262がありました)

--enable-encoder=rawvideo --enable-encoder=mpeg4 エンコーダを有効にする rawvideo は yuv に対応し、mpeg4 は mp4 に対応します

--enable-decoder=rawvideo --enable-decoder=mpeg4 --enable-decoder=movtext デコーダを有効にします。ここでは、mp4 を解凍するために movtext を有効にする必要があります。

--enable-muxer=aiff --enable-muxer=h263 --enable-muxer=mp4 --enable-muxer=rawvideo コンポジタを有効にする

--enable-demuxer=aac --enable-demuxer=aiff --enable-demuxer=h263 --enable-demuxer=mov --enable-demuxer=rawvideo イネーブル スプリッタ

--enable-parser=aac --enable-parser=h263 --enable-parser=mpegaudio --enable-parser=mpeg4video 使用能解析器

--enable-indev=v4l2 --enable-outdev=v4l2 入力デバイス、出力デバイスを有効にする (有効にしない場合、コーデックのみビデオをキャプチャできません)

--enable-filter=scale フィルターを有効にします。これは yuv 形式の変換に使用されます。yuv には相互に変換するための複数の形式があります。

環境ツール (異なるプラットフォームでは異なるツールが使用されます)

--cc=CC C プログラムのコンパイラを指定します。--cxx=CXX C++ コンパイラを指定します。--ld=LD はリンカーを指定します。

--custom-allocator、カスタム メモリ アロケータ。malloc を jemalloc などに置き換えることができます。

--arch=x86_32/i386/x86_64/arm64、

  1. プロトコル
  • --enable-protocol=file ファイルプロトコルを有効にします。これを解放する必要があります。

コンパイルスクリプト(以下、configure

~/ffmpeg-4.2.2 $ cat load.sh
#!/bin/bash

if [ -d build ];then
	mkdir build
fi

./configure \
    --prefix=build \
    --enable-gpl \
    --enable-nonfree \
    --enable-debug=3 \
    --disable-optimizations \
    --disable-asm \
    --disable-stripping \
    --disable-ffprobe \
    --disable-ffplay

コードのバージョンは git によって管理され、configure実行後に生成される新しいファイルは次のとおりです。

~/ffmpeg-4.2.2 $ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	config.h
	doc/config.texi
	ffbuild/.config
	ffbuild/config.fate
	ffbuild/config.log
	ffbuild/config.mak
	ffbuild/config.sh
	libavcodec/bsf_list.c
	libavcodec/codec_list.c
	libavcodec/parser_list.c
	libavdevice/indev_list.c
	libavdevice/outdev_list.c
	libavfilter/filter_list.c
	libavformat/demuxer_list.c
	libavformat/muxer_list.c
	libavformat/protocol_list.c
	libavutil/avconfig.h

再度実行すると永久にconfigure、次のようにメインの設定ファイルも表示されます。

License: nonfree and unredistributable
config.h is unchanged
libavutil/avconfig.h is unchanged
libavfilter/filter_list.c is unchanged
libavcodec/codec_list.c is unchanged
libavcodec/parser_list.c is unchanged
libavcodec/bsf_list.c is unchanged
libavformat/demuxer_list.c is unchanged
libavformat/muxer_list.c is unchanged
libavdevice/indev_list.c is unchanged
libavdevice/outdev_list.c is unchanged
libavformat/protocol_list.c is unchanged
ffbuild/config.sh is unchanged

ここで出力configureされる情報は、makeを実行してコンパイルした後に得られるプログラムとその関数情報を示しています。

~/ffmpeg-4.2.2 $ cat log | grep :
External libraries:
External libraries providing hardware acceleration:
Libraries:
Programs:
Enabled decoders:
Enabled encoders:
Enabled hwaccels:
Enabled parsers:
Enabled demuxers:
Enabled muxers:
Enabled protocols:
Enabled filters:
Enabled bsfs:
Enabled indevs:
Enabled outdevs:
License: nonfree and unredistributable

次に make -j16 を実行してコンパイルして実行します。ここでの 16 は 16 個のサブスレッドで同時にコンパイルすることを意味します。シェルのマルチスレッド技術については少ししか知りません。make ツールについてはあまり知りません。国内の記事では曖昧に説明されていますが、**「j の後の数字は CPU コア数の 2 倍にする必要がある」** という記事があります。正確かどうかはわかりませんが、これまで意図的にシェルを使用して 16 個のコアをテストしてきました。それぞれスレッドと無制限のスレッド (私のコンピューターには 8 コアがあります) を使用すると、無制限のスレッドの方が 16 よりもはるかに短い時間がかかることは明らかです (シェルのマルチスレッドとプログラム プロセスのマルチスレッドの違いがよくわかっていない可能性があります)。興味があるなら自分で勉強してもいいよ

make 後、ファイルの変更を確認します。これは同じです。以前のファイルをここにgit status追加した後configurtion、新しく生成されたファイルは基本的にファイルです。変更または生成されたファイルは3533 個.d和.oあります。

~/ffmpeg-4.2.2 $ git status | wc -l
3533

編集された情報:

~/ffmpeg-4.2.2 $ du ffmpeg ffmpeg_g
68M	ffmpeg
68M	ffmpeg_g

~/ffmpeg-4.2.2 $  ldd ffmpeg_g
	linux-vdso.so.1 (0x00007ffea3f66000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4c782ef000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f4c782d3000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4c780ab000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f4c7a510000)

~/ffmpeg-4.2.2 $ file ffmpeg_g
ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5a51fa6f5eb1997656814577ef36b945fd21a07b, for GNU/Linux 3.2.0, with debug_info, not stripped

静的リンクの場合でも、依然としてシステムの一部の動的ライブラリに依存していることがわかります (静的ライブラリでコンパイルするためのスクリプトは前のスクリプトに追加されていません --enable-shared )。

完全な静的コンパイル

さらに 3 つの静的フラグを追加する必要があります

~/ffmpeg-4.2.2 $ cat load.sh
#!/bin/bash

if [ ! -d build ];then
    mkdir build
fi

#在执行 这条命令之前,需要安装一些必备的静态库,因为操作系统为了节省硬盘空间,默认可能只有动态库,一些静态库需要手动安装的

#sudo apt install libc6-dev build-essential -y

./configure \
    --prefix=build \
    --enable-gpl \
    --enable-nonfree \
    --enable-debug=3 \
    --disable-optimizations \
    --disable-asm \
    --disable-stripping \
    --disable-ffprobe \
    --disable-ffplay \
    --extra-cflags="-static" \
    --extra-ldflags="-static" \
    --pkg-config-flags="--static"

まとめられた情報

~/ffmpeg-4.2.2 $ file ffmpeg_g
ffmpeg_g: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=9d75510c5c79ba9e47b1ea617e4f97308c75795e, for GNU/Linux 3.2.0, with debug_info, not stripped

~/ffmpeg-4.2.2 $ du ffmpeg_g
69M	ffmpeg_g

ダウンロード - コンパイル スクリプト (Android)

#!/bin/bash

cd ~/

if [ ! -f "ffmpeg-4.2.2.tar.bz2" ];then
   wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2
   tar -xjvf ffmpeg-4.2.2.tar.bz2
fi
cd ffmpeg-4.2.2

path=($(ls ~/Library/Android/sdk/ndk/))
export NDK=$HOME/Library/Android/sdk/ndk/${path[0]}

echo -e " \033[31m 检测ndk-build 版本,将使用${NDK}进行编译\033[0m"
echo -e "\n请选择要编译的版本架构:[64/32]"

read archbit

if [[ $archbit = 64 ]];then
	echo "start build for 64bit..."
	ARCH=aarch64
	CPU=armv8-a
	API=23
	PLATFORM=aarch64
	ANDROID=android
	CFLAGS=""
	LDFLAGS=""
elif [[ $archbit = 32 ]];then
	echo "start build for 32bit..."
	ARCH=arm
	CPU=armv7-a
	API=23
	PLATFORM=armv7a
	ANDROID=androideabi
	CFLAGS="-mfloat-abi=softfp -march=$CPU"
	LDFLAGS="-Wl,--fix-cortex-a8"
else
	exit
fi

export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin
export SYSROOT=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot
export CROSS_PREFIX=$TOOLCHAIN/$ARCH-linux-$ANDROID-
export CC=$TOOLCHAIN/$PLATFORM-linux-$ANDROID$API-clang
export CXX=$TOOLCHAIN/$PLATFORM-linux-$ANDROID$API-clang++
export PREFIX=../ffmpeg-android/$CPU

function build_android {
  ./configure \
      --prefix=$PREFIX \
      --cross-prefix=$CROSS_PREFIX \
      --target-os=android \
      --arch=$ARCH \
      --cpu=$CPU \
      --cc=$CC \
      --cxx=$CXX \
      --nm=$TOOLCHAIN/$ARCH-linux-$ANDROID-nm \
      --strip=$TOOLCHAIN/$ARCH-linux-$ANDROID-strip \
      --enable-cross-compile \
      --sysroot=$SYSROOT \
      --extra-cflags="$CFLAGS" \
      --extra-ldflags="$LDFLAGS" \
      --extra-ldexeflags=-pie \
      --enable-runtime-cpudetect \
      --disable-static \
      --enable-shared \
      --disable-ffprobe \
      --disable-ffplay \
      --disable-debug \
      --disable-doc \
      --enable-avfilter \
      --enable-decoders \
      $ADDITIONAL_CONFIGURE_FLAG

  make clean
  make -j16
  make install
}

build_android

同様に、上記でも必要な機能はキャンセルされていますが、ここでのスクリプトは自動コンパイル機能のみであり、使用したい特定の ffmpeg 機能もオンデマンドで取得できます。

元のリンク: ffmpeg のコンパイルとパラメーターの解釈について_HNHuangJingYu のブログ-CSDN ブログ

★記事末尾の名刺では、(FFmpeg、webRTC、rtmp、hls、rtsp、ffplay、srs)を含むオーディオおよびビデオ開発学習教材やオーディオおよびビデオ学習ロードマップなどを無料で受け取ることができます。

下記参照!

 

おすすめ

転載: blog.csdn.net/yinshipin007/article/details/131455881