学習記事: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、
- プロトコル
--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)を含むオーディオおよびビデオ開発学習教材やオーディオおよびビデオ学習ロードマップなどを無料で受け取ることができます。
下記参照!