天天看點

linux下編譯ffmpeg 以及交叉編譯并引入Android

作者:音視訊流媒體技術

linux下編譯ffmpeg

下載下傳:

http://ffmpeg.org/download.html           
linux下編譯ffmpeg 以及交叉編譯并引入Android

支援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 等等)有需要的可以點選加群免費領取~

linux下編譯ffmpeg 以及交叉編譯并引入Android

配置環境變量

在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檔案夾,裡面就是我們需要的編譯結果了:

linux下編譯ffmpeg 以及交叉編譯并引入Android
linux下編譯ffmpeg 以及交叉編譯并引入Android
linux下編譯ffmpeg 以及交叉編譯并引入Android

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           
linux下編譯ffmpeg 以及交叉編譯并引入Android
linux下編譯ffmpeg 以及交叉編譯并引入Android

缺少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

繼續閱讀