linux下編譯ffmpeg
下載下傳:
http://ffmpeg.org/download.html
支援mp3編碼:ffmpeg自身隻支援mp3的解碼但是不支援mp3的編碼,如果希望格式轉換為mp3,我們可以先安裝支援庫lame:(使用時: ffmpeg -i audio.wav -acodec libmp3lame audio.mp3)
#下載下傳`
wget https://jaist.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
#解壓
tar -zxvf lame-3.99.5.tar.gz
cd lame-3.99.5
#編譯并安裝
./configure --enable-shared
make
make install
#建立動态庫連接配接:
vi /etc/ld.so.conf :追加 /usr/local/lib :安裝後的lame的動态庫均在此路徑下
ldconfig //使得連接配接配置生效
編譯:(更多參數見./configure --help):最終編譯完成後位于/usr/local/ffmpeg下
cd ffmpeg
#可選參數 --disable-static:關閉靜态庫 --enable-shared:打開動态庫 ;預設配置是生成靜态連結庫so,添加此配置即生成動态庫 --enable-libmp3lame 支援使用lame進行mp3編碼
#通過configure指令産生編譯的make腳本,接下來就是利用腳本進行編譯
./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --disable-static --enable-shared --enable-libmp3lame
make -j 4
make install
--prefix 參數指定編譯輸出的路徑 --enable-debug=3 意思是開啟調試
編譯出現的錯誤: gcc is unable to create an executable file. If gcc is a cross-compiler, use the --enable-cross-compile option. Only do this if you know what cross compiling means. C compiler test failed.
//未安裝gcc:
sudo apt-get install gcc
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
If you think configure made a mistake, make sure you are using the latest version from Git. If the latest version fails, report the problem to the [email protected] mailing list or IRC #ffmpeg on irc.freenode.net. Include the log file "ffbuild/config.log" produced by configure as this will help solve the problem.
//yasm是彙編編譯器,ffmpeg為了提高效率使用了彙編指令,如MMX和SSE等。是以系統中未安裝yasm
sudo apt install yasm
缺少make:
sudo apt install make
kdir: cannot create directory ‘/usr/local/ffmpeg’: Permission denied make: *** [ffbuild/library.mak:102: install-libavdevice-shared] Error 1
沒有權限:
#設定root 密碼
sudo passwd
#輸入,并重複輸入密碼
su
#輸入密碼切換為root身份,接着進行 make install
相關學習資料推薦,點選下方連結免費報名,先碼住不迷路~】
【免費分享】音視訊學習資料包、大廠面試題、技術視訊和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點選加群免費領取~
配置環境變量
在home或者etc目錄下使用vim打開.profile檔案 進行環境配置: 配置path :
export PATH=$PATH:/usr/local/ffmpeg/bin
配置pkg_config_path:
export PKG_CONFIG_PATH=/usr/local/ffmpeg/lib/pkgconfig
配置完成後要source .profile生效配置:具體可以通過echo $PATH檢視是否生效,pkg同理。
make install完成後就會在指定目錄生成編譯後資源(/usr/local/ffmpeg)
bin include lib share
bin目錄裡是ffmpeg支援的指令,include裡是頭檔案,lib是生成的動态庫/靜态庫,share是一些文檔資訊
沒有編譯出ffplay處理:
有可能安裝完之後發現bin内沒有ffplay,多半是系統沒有配置sdl2,進行對應的安裝:
sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev
安裝完成後重新去configure,以及make和install即可
接着輸入ffmpeg即可看到配置好的資訊了,如果出現報錯:
ffmpeg:error while loading shared libraries:libavdevice.so.59:cannot shared object file: No such file or directory
這是so沒能建立軟連接配接,隻需要去vi /etc/ld.so.conf 增加ffmpeg的lib路徑配置即可:
/usr/local/ffmpeg/lib
添加完成後,執行ldconfig使其生效
完成後我們即可使用ffmpeg了,例如:
#提取音源
ffmpeg -i test.mp4 -acodec copy -vn test.aac
#剔除人聲
ffmpeg -i test.aac -af pan="stereo|c0=c0|c1=-1*c1" -ac 1 test_only_bg.aac
#提取視訊源
ffmpeg -i test.mp4 -vcodec copy -an test.h264
#合成輸出
ffmpeg -i test.h264 -i test_only_bg.aac -vcodec copy -acodec copy final.mp4
#播放
ffmplay final.mp4
編譯出Android可用的ffmpeg并內建引入Android中:
下載下傳ndk:
下載下傳linux版本解壓即可:
developer.android.google.cn/ndk/downloa… 或者直接 curl dl.google.com/android/rep… --output ndk-r21.zip
生成ndk交叉編譯工具鍊:(以下為ndk r21e版本的編譯)
使用ndk下的make-standalone-toolchain.sh腳本進行工具鍊的生成,路徑位于:ndk/{ndk版本}/build/tools/make-standalone-toolchain.sh 腳本關鍵參數: --toolchain=arm-linux-androideabi-4.9 (指定編譯工具鍊版本) --platform=android-19(指定sdk平台最低支援版本) --install-dir=../toolchain(指定生成工具鍊的輸出目錄)
#将腳本設定為可執行
chmod +x make-standalone-toolchain.sh
sudo ./make-standalone-toolchain.sh --platform=android-19 --install-dir=ndktoolchain
#或者通過通過python執行
python make_standalone_toolchain.py --api 19 --arch arm --install-dir ndktoolchain
執行完畢後,就會将所有相關的檔案編譯到目前目錄下的ndktoolchain裡
建立編譯腳本:
因為Android支援多種cpu架構,為了友善,我們建立一個編譯腳本,裡面是生成不同版本so的指令: 我們在下載下傳好的ffmpeg路徑下建立build_ffmpeg.sh:
#!/bin/bash
#在ffmpeg目錄下執行該腳本,輸出在ffmpeg目錄下的android-build 目錄裡
PREFIX=./android-build
API=21
#設定你自己的NDK位置
NDK_HOME=/home/yy19920402/android-ndk-r21e/toolchain
COMMON_OPTIONS="\
--target-os=android \
--disable-static \
--enable-shared \
--enable-small \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--disable-asm \
"
function build_android (){
./configure \
--libdir=${PREFIX}/libs/armeabi-v7a \
--incdir=${PREFIX}/includes/armeabi-v7a \
--pkgconfigdir=${PREFIX}/pkgconfig/armeabi-v7a \
--arch=arm \
--cpu=armv7-a \
--cc=${NDK_HOME}/bin/arm-linux-androideabi-clang \
--cross-prefix="${NDK_HOME}/bin/arm-linux-androideabi-" \
--sysroot="${NDK_HOME}/sysroot/" \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
make clean
make -j8 && make install
./configure \
--libdir=${PREFIX}/libs/arm64-v8a \
--incdir=${PREFIX}/includes/arm64-v8a \
--pkgconfigdir=${PREFIX}/pkgconfig/arm64-v8a \
--arch=aarch64 \
--cpu=armv8-a \
--cc=${NDK_HOME}/bin/aarch64-linux-android${API}-clang \
--cross-prefix="${NDK_HOME}/bin/aarch64-linux-android-" \
--sysroot="${NDK_HOME}/sysroot/" \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
make clean
make -j8 && make install
./configure \
--libdir=${PREFIX}/libs/x86 \
--incdir=${PREFIX}/includes/x86 \
--pkgconfigdir=${PREFIX}/pkgconfig/x86 \
--arch=x86 \
--cpu=i686 \
--cc=${NDK_HOME}/bin/i686-linux-android${API}-clang \
--cross-prefix="${NDK_HOME}/bin/i686-linux-android-" \
--sysroot="${NDK_HOME}/sysroot/" \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
make clean
make -j8 && make install
./configure \
--libdir=${PREFIX}/libs/x86_64 \
--incdir=${PREFIX}/includes/x86_64 \
--pkgconfigdir=${PREFIX}/pkgconfig/x86_64 \
--arch=x86_64 \
--cpu=x86_64 \
--cc=${NDK_HOME}/bin/x86_64-linux-android${API}-clang \
--cross-prefix="${NDK_HOME}/bin/x86_64-linux-android-" \
--sysroot="${NDK_HOME}/sysroot/" \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
make clean
make -j8 && make install
}
build_android
可以看到腳本裡的指令和我們之前的編譯ffmpeg并沒有太大差別,依然是使用configure進行的編譯,隻不過補充了一些額外的參數,比如交叉編譯工具路徑,架構類型,輸出so以及頭檔案路徑等等,具體配置相關含義,感興趣可以自己查閱文檔或者搜尋 接着進行執行編譯即可:
chmode +x build_ffmpeg.sh
sudo ./build_ffmpeg.sh
如果編譯不成功,注意檢查一下,腳本中--cc和--cross-prefix對應的配置,ndk生成的交叉編譯工具鍊中是否有這些檔案. 編譯完成後會在指定的路徑即ffmpeg路徑下生成android-build檔案夾,裡面就是我們需要的編譯結果了:
include和lib中分别存放的是不同架構的頭檔案和動态庫檔案
增加h264編碼支援
因為ffmpeg h264的編碼需要x264,是以我們要額外自己添加支援, 例如h5預設的video标簽支援mp4視訊,但是mp4作為封裝格式裡面的視訊源video标簽隻支援h264格式的,而實際有些mp4裡視訊源标簽為mpeg4。是以需要做格式轉換,當然也可以由前端編解碼增加播放支援.
下載下傳x264源碼:
www.videolan.org/developers/… 完成後同ffmpeg一樣通過configure進行配置
./configure --enable-shared
make
make install
#同mp3支援一樣需要配置一下動态連結
vi /etc/ld.so.conf :追加 /usr/local/lib :安裝後的lame,x264的動态庫均在此路徑下 ldconfig //使得連接配接配置生效
#接着重新編譯ffmpeg 開啟x264即可 見下方圖檔提示,開啟x264需要同時開啟gpl
./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --disable-static --enable-shared --enable-libmp3lame --enable-libx264 --enable-gpl
make -j 4
make install
ldconfig
缺少nasm:
Found no assembler Minimum version is nasm-2.13 If you really want to compile without asm, configure with --disable-asm.
sudo apt-get install nasm
原文 https://juejin.cn/post/6985526545847124005