ffmpeg編譯靜態庫
⑴ 如何編譯ffmpeg for iphone
編譯iPhone下的FFmpeg
mkdir ./build
# configure for armv7 build
./configure \
--cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \
--as='gas-preprocessor.pl /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' \
--sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk \
--extra-ldflags=-L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib/system \
--target-os=darwin \
--arch=arm \
--cpu=cortex-a8 \
--extra-cflags='-arch armv7' \
--extra-ldflags='-arch armv7' \
--enable-pic \
--enable-cross-compile \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-doc
# build for armv7
make clean
make
# out the armv7 libs
mkdir ./build/armv7
cp -f ./libavcodec/libavcodec.a ./build/armv7/libavcodec.a
cp -f ./libavdevice/libavdevice.a ./build/armv7/libavdevice.a
cp -f ./libavfilter/libavfilter.a ./build/armv7/libavfilter.a
cp -f ./libavformat/libavformat.a ./build/armv7/libavformat.a
cp -f ./libavutil/libavutil.a ./build/armv7/libavutil.a
cp -f ./libswscale/libswscale.a ./build/armv7/libswscale.a
# configure for armv6 build
./configure \
--cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \
--as='gas-preprocessor.pl /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' \
--sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk \
--extra-ldflags=-L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib/system \
--target-os=darwin \
--arch=arm \
--cpu=arm1176jzf-s \
--extra-cflags='-arch armv6' \
--extra-ldflags='-arch armv6' \
--enable-cross-compile \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-doc
# build for armv6
make clean
make
# out the armv6 libs
mkdir ./build/armv6
cp -f ./libavcodec/libavcodec.a ./build/armv6/libavcodec.a
cp -f ./libavdevice/libavdevice.a ./build/armv6/libavdevice.a
cp -f ./libavfilter/libavfilter.a ./build/armv6/libavfilter.a
cp -f ./libavformat/libavformat.a ./build/armv6/libavformat.a
cp -f ./libavutil/libavutil.a ./build/armv6/libavutil.a
cp -f ./libswscale/libswscale.a ./build/armv6/libswscale.a
# configure for i386 build
./configure \
--cc=/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc \
--as='gas-preprocessor.pl /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc' \
--sysroot=/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk \
--extra-ldflags=-L/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/lib/system \
--target-os=darwin \
--arch=i386 \
--cpu=i386 \
--extra-cflags='-arch i386' \
--extra-ldflags='-arch i386' \
--enable-cross-compile \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-doc
# build for i386
make clean
make
# out the i386 libs
mkdir ./build/i386
cp -f ./libavcodec/libavcodec.a ./build/i386/libavcodec.a
cp -f ./libavdevice/libavdevice.a ./build/i386/libavdevice.a
cp -f ./libavfilter/libavfilter.a ./build/i386/libavfilter.a
cp -f ./libavformat/libavformat.a ./build/i386/libavformat.a
cp -f ./libavutil/libavutil.a ./build/i386/libavutil.a
cp -f ./libswscale/libswscale.a ./build/i386/libswscale.a
# make fat (universal) libs
lipo -output ./build/libavcodec.a -create \
-arch armv6 ./build/armv6/libavcodec.a \
-arch armv7 ./build/armv7/libavcodec.a \
-arch i386 ./build/i386/libavcodec.a
lipo -output ./build/libavdevice.a -create \
-arch armv6 ./build/armv6/libavdevice.a \
-arch armv7 ./build/armv7/libavdevice.a \
-arch i386 ./build/i386/libavdevice.a
lipo -output ./build/libavfilter.a -create \
-arch armv6 ./build/armv6/libavfilter.a \
-arch armv7 ./build/armv7/libavfilter.a \
-arch i386 ./build/i386/libavfilter.a
lipo -output ./build/libavformat.a -create \
-arch armv6 ./build/armv6/libavformat.a \
-arch armv7 ./build/armv7/libavformat.a \
-arch i386 ./build/i386/libavformat.a
lipo -output ./build/libavutil.a -create \
-arch armv6 ./build/armv6/libavutil.a \
-arch armv7 ./build/armv7/libavutil.a \
-arch i386 ./build/i386/libavutil.a
lipo -output ./build/libswscale.a -create \
-arch armv6 ./build/armv6/libswscale.a \
-arch armv7 ./build/armv7/libswscale.a \
-arch i386 ./build/i386/libswscale.a
上面針對i386,也就是模擬器的編譯配置不一定,下面有另一種配置方式:
./configure \
--disable-bzlib \
--disable-mmx \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--cc=/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/i686-apple-darwin10-gcc-4.2.1 \
--as='gas-preprocessor/gas-preprocessor.pl /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/i686-apple-darwin10-gcc-4.2.1' \
--sysroot=/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk \
--extra-cflags='-fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -O0 -fasm-blocks -Wreturn-type -Wunused-variable -D__IPHONE_OS_VERSION_MIN_REQUIRED=30000 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk -fvisibility=hidden -mmacosx-version-min=10.5 -gdwarf-2'
另外一篇文章
移值FFMPEG到iPhone或Mac OS/X
有關FFMPEG的詳細說明可以參考網上相關文檔;在這里我們只講述FFMPEG移到iPhone或Mac OS/X的過程及相關注意事項。
FFMPEG功能相當強大,在完整的FFMPEG包中就包含了ffserver, ffplay, ffmpeg, avcodec, avdevice, avformat, avutil, swscale等;其中ffserver, ffplay, ffmpeg為應該程序,對與我們這些從事軟體開發的人來說基本上沒什麼用;而avcodec為加解碼庫、avformat為格式庫,avutil則為基礎庫(但平常我們很少用到), swscale則為圖象處理庫;所以我們所要的就是移值avcodec, avformat, avutil, swscale這四個庫。
移值到Mac OS/X下過程:
一、 配置
./configure --prefix=/Developer/usr --cc=/Developer/usr/bin/gcc-4.0 --enable-gpl --enable-shared --disable-ipv6 --enable-swscale --enable-zlib --enable-bzlib --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-vhook
二、 編譯
make
三、 安裝
make install
說明:上面的/Developer/usr為目標目錄,如果你的Xcode為默認安裝,則這樣安裝後既可以在Xcode中編譯及調式你的代碼了;
移值到Mac OS/X下的模擬iPhone平台下過程:
一、 配置
./configure --prefix=/Developer/usr --disable-debug --cc=/Developer/usr/bin/i686-apple-darwin9-gcc-4.0.1 --enable-gpl --enable-static --disable-shared --disable-ipv6 --enable-swscale --enable-zlib --enable-bzlib --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-vhook --enable-pthreads
其中:也可以加入--enable-shared,這個選項是允許其編譯產生動態庫,在以後的編程中要用到這個幾個動態庫。--prefix設置的安裝目錄。如果在configure的時候不加上--enable-shared的,則採用靜態鏈接的方式,不會生成那三個動態庫。同時生成的ffplay、ffmpeg的執行文件也比較的大,因為他們不需要動態庫的支持,就可以執行。但是不利於再次開發,所以我也可以考慮採用動態鏈接的方式。
二、 編譯
make
三、 安裝
make install
安裝之後在/usr/local/ffmpeg會看到有三個目錄
lib 動態鏈接庫位置
include 編程要用到頭文件
bin 執行文件所在的目錄
為了以後方便編程,我們把lib中的三個鏈接庫libavcodec.so libavformat.so libavutil.so復制到/usr/lib下。把include目錄下的ffmpeg目錄復制到/usr/include下。執行bin目錄下的ffplay,可以去播放音頻或者視頻文件。例如播放1.mp3
./ffplay 1.mp3
另外,bin目錄下還有兩個文件:ffmpeg和ffserver
ffmpeg是一個很好的視頻和音頻的格式轉化工具。網上有很多它的說明文檔。如果不想生成ffserver,只要在./configure的時候加--disable-ffserver即可。
說明:上面的/Developer/usr為目標目錄,如果你的Xcode為默認安裝,則這樣安裝後既可以在Xcode中編譯及在模擬器下調式你的代碼了;
移值到iPhone平台下過程:
一、 配置
./configure --enable-cross-compile --cross-prefix=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ --cc=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin9-gcc-4.0.1 --prefix=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk/usr --extra-cflags="-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk" --extra-ldflags="-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk -Wl,-syslibroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk" --arch=armv6 --enable-armv6 --enable-gpl --enable-shared --disable-ipv6 --enable-swscale --enable-zlib --enable-bzlib --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-vhook
二、 編譯
make
三、 安裝
make install
說明:上面的/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/為目標目錄,如果你的Xcode為默認安裝,則這樣安裝後既可以在Xcode中編譯及在模擬器下調式你的代碼了。
相關說明:
在ffmpeg中如果使用靜態庫則會出現一些連接錯;所以在安裝ffmpeg庫時請選中動態庫。
OK,到現在我們就你已經知道了如何把ffmpeg移到到iPhone下並把ffmpeg庫和Xcode結合起來了吧;當然如果你的Xcode工具非默認安裝,請更上相關目錄選項.
⑵ vs2013 怎麼編譯 ffmpeg
. 下載FFMPEG源碼,下載地址:http://ffmpeg.zeranoe.com/builds/;
2. 下載MinGW安裝器,嫌毀皮下載地址:http://www.mingw.org/;下載完成芹差後安裝,安裝完成後點運行,標記上以下幾項:
然後在Installation菜單下點擊Apply Changes(mingw32-gcc-g++不用選擇);
3. 下載yasm,下載地址: http://yasm.tortall.NET/ ;下載後改名為yasm.exe,復制到C:/MinGW/msys/1.0/bin目錄下;
4. 配置C:/MinGW/msys/1.0/msys.bat,在此文件的最前面(@echo off之後)添加一行如下內容:
call "D:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat" (依實際安裝路徑修改路徑);
5.重命名 C:/MinGW/msys/1.0/bin/link.exe 為link_renamed.exe (依實際安裝選擇路徑),這一步是防止這個link.exe與vc的link.exe發生沖突,編譯完成後可修改回余睜來;
6. 配置編譯,雙擊msys.bat,轉到FFMPEG源代碼根目錄下,可運行 ./configure --help查看編譯配置選項,我使用的選項為:
靜態庫:./configure --enable-static --prefix=./vs2013_build --enable-debug --toolchain=msvc
動態庫:./configure --enable-shared --prefix=./vs2013_build --enable-debug --toolchain=msv
⑶ 如何將FFmpeg源碼編譯一個so庫
我們從上篇文章 FFmpeg編譯 知道,正常打出來的有5個so包,當然有它的好處是按需引入。但是如果都需要,那是不是覺得很多呢?那可不可以打出一個so呢?答案是當然可以,下面以armv7-a平台為例,腳本如下。
其實在上篇 FFmpeg編譯 中腳本的基礎上添加如下即可打出一個so包:
編譯完成大概需要幾分鍾。
android/armv7-a下生成一個ffmpeg.so
libffmpeg.so及相應的同文件到工程里就好
⑷ ffmpeg 64位編譯腳本
NDK版本:android-ndk-r14b
ffmpeg版本:4.2.4 / 4.4
Ubuntu版本:15.5
#!/bin/bash
NDK=/home/linrendi/Desktop/Compile/android-ndk-r14b
PLATFORM=$NDK/platforms/android-21/arch-arm64
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
PREFIX=/home/linrendi/Desktop/ffmpeg64
CPU=armv8-a
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=android \
--disable-doc \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--arch=arm64 \
--cpu=$CPU \
--disable-asm \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
--cc=$TOOLCHAIN/bin/aarch64-linux-android-gcc \
--nm=$TOOLCHAIN/bin/aarch64-linux-android-nm \
--disable-shared --enable-static \
--enable-small --disable-debug \
--disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-symver \
--enable-neon --enable-pthreads \
--disable-devices --disable-encoders \
--enable-hwaccels --enable-jni --enable-mediacodec \
--enable-encoder=aac \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec \
--enable-encoder=mjpeg \
--enable-encoder=ljpeg --enable-encoder=jpeg2000 --enable-encoder=jpegls \
--enable-muxer=mp4 --enable-muxer=mjpeg \
--enable-runtime-cpudetect \
make clean
make -j4
make install
$TOOLCHAIN/bin/aarch64-linux-android-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
libavdevice/libavdevice.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/aarch64-linux-android/4.9.x/libgcc.a
}
build_one
⑸ 如何使用ndk為ffmpeg編譯rtmp+polarssl靜態庫
如何使用ndk為ffmpeg編譯rtmp+polarssl靜態庫?這個問題花了我整整一天時間。其中遇到很多小問題,這里記錄一下,方便自己也方便其他人。
1、編譯polarssl,查看其Readme文件即可,不需要configure,只需要make時帶上必要的參數即可,不過要記得在每一次執行make命令時都帶上CC的參數(指向你的arm gcc),因為我試過在make install時沒有帶上CC的參數,雖然能編譯出polarssl但是未能正確被rtmp引用到。
2、因為前面我用的polarssl是當前最新(1.3.7)版本,而librtmp使用的好像是polarssl1.0.0以下版本的api,所以需要修改rtmp部分源碼,讓其調用新版polarssl的api,這里的修改可以參照《Migrating from PolarSSL-1.2 to the PolarSSL 1.3 branch》和《[rtmpmp] branch master updated. a312ac7 Fix compat with PolarSSL >= 1.1.0》。
3、出現 undefined reference to `havege_random』錯誤,這里是因為polarssl默認關閉了havege模塊,需要你手動開啟,主要就是修改include/polarssl/config.h,去掉POLARSSL_HAVEGE_C前的注汪槐釋,也就是要定義POLARSSL_HAVEGE_C,如下:
#define POLARSSL_HAVEGE_C
4、在編譯出上面兩個庫之後,可以開始編譯ffmpeg(2.1.1版本)了,如果遇到下面的問題 check_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
ERROR: librtmp not found
這里有三種解決方法:
第一種,因為是網路上傳播最多的,算猛陵升是比較簡便的方法,就是修改ffmpeg的configure,將以下一行:
enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
改為:
enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp -lpolarssl -lz
或者直接注釋掉&& *** 部分,然後再自己加上librtmp的庫路徑也行
第二種,(比較推薦,因為解決了這個會順帶解決大部分找不到庫的錯誤!)因為這里使用了pkg-config工具查找庫,而這個工具ndk並沒有附帶提供,而出現check_pkg_config相關錯誤的話,只要稍加註枝老意,會發現在使用configure配置ffmpeg的交叉編譯時,已經有相應的pkg-config不存在的警告了。我對這個工具不熟悉,所以我只是簡單地加上了一個軟鏈接到系統的pkg-config,如下:
ln -s /usr/bin/pkg-config /home/cidy0106/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config
這個時候重新configure的話可能會出現找不到polarssl庫的錯誤提示,需要修改一下librtmp安裝目錄里的librtmp.pc,把以下內容:
Libs: -L${libdir} -lrtmp -lz
改為:
Libs: -L${libdir} -lrtmp -lz -lpolarssl
至此,就可以正確編譯出ffmpeg了
⑹ Ubuntu下使用mingw-w64交叉編譯ffmpeg
網上大部分編譯windows版ffmpeg的教程都是基於msys+mingw的,完全運行在windows上。由於msys2的性能實在是太糟糕了,編譯速度太感人,因此決定研究Linux下使用mingw-w64交叉編譯
先是安裝ubuntu版的mingw-w64
sudo apt install mingw-w64
然後在configure ffmpeg的時候,在正常的配置項之後加上。
--arch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32-
上面是32位庫編譯的配置,64位的如下
--arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32-
而且最好使用動態庫,靜態庫還需要鏈接一大堆mingw的庫實現,而且還可能鏈接失敗。但這樣編譯出來的動態庫,還需要依賴 libgcc_s_sjlj-1.dll。如果要移除這個依賴,configure的時候還要加上 --extra-ldflags='-static-libgcc'
⑺ OpenCV靜態庫編譯與鏈接
以OpenCV-4.0.0為例說明在Ubuntu環境下的靜態庫編譯與鏈接方法:
opencv依賴第三方的庫,所以當把opencv編譯成靜態庫的時候,注意要把它運行時必要的依賴庫也編譯進來,opencv源碼內有自己的3rdparty,主要有:libjpeg、libpng、libtiff、libzlib、libwebp、libprotobuf、ffmpeg(用到video時編譯)、libgtk(用於顯示界面顯示,伺服器部署不會用到),可以通過cmake -LA來查看配置的編譯信息,再根據信息考慮把opencv的哪些mole編譯進來。
鏈接時指定opencv的靜態庫以及依賴的庫。另外需要注意頭文件的問題,通過CMakeLists把opencv加入項目編譯時,由於opencv編譯完成後要install才會把所用的頭文件集中拷貝到一個地方,所以事先將頭文件拷貝到了項目的opencv目錄下。
⑻ 求教高手:如何在NDKr5下用單獨的靜態庫編譯
何使用ndkffmpeg編譯rtmp+polarssl靜態庫問題花我整整間其遇問題記錄便自便其 一、編譯polarssl查看其Readme文件即需要configure需要make帶必要參數即要記每執行make命令都帶CC參數(指向arm gcc)我試make install沒帶CC參數雖能編譯polarssl未能確rtmp引用 二、前面我用polarssl前新(一.三.漆)版本librtmp使用像polarssl一.0.0版本api所需要修改rtmp部源碼讓其調用新版polarsslapi修改參照《Migrating from PolarSSL-一.二 to the PolarSSL 一.三 branch》《[rtmpmp] branch master updated. a三一二ac漆 Fix compat with PolarSSL >= 一.一.0》 三、現 undefined reference to `havege_random』錯誤polarssl默認關閉havege模塊需要手啟主要修改include/polarssl/config.h掉POLARSSL_HAVEGE_C前注釋要定義POLARSSL_HAVEGE_C: #define POLARSSL_HAVEGE_C 四、編譯面兩庫始編譯ffmpeg(二.一.一版本)遇面問題 check_pkg_config librtmp librtmp/rtmp.h RTMP_Socket ERROR: librtmp not found 三種解決: 第種中國絡傳播算比較簡便修改ffmpegconfigure行: enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket 改: enabled librtmp && require librtmp librtmp/rtmp.h RTMP_Socket -lrtmp -lpolarssl -lz 或者直接注釋掉&& *** 部再自加librtmp庫路徑行 第二種(比較推薦解決順帶解決部找庫錯誤)使用pkg-config工具查找庫工具ndk並沒附帶提供現check_pkg_config相關錯誤要稍加註意發現使用configure配置ffmpeg交叉編譯已經相應pkg-config存警告我工具熟悉所我簡單加軟鏈接系統pkg-config: ln -s /usr/bin/pkg-config /home/cidy0一0陸/android-ndk-r9d/toolchains/arm-linux-androideabi-四.吧/prebuilt/linux-x吧陸_陸四/bin/arm-linux-androideabi-pkg-config 候重新configure能現找polarssl庫錯誤提示需要修改librtmp安裝目錄librtmp.pc,內容: Libs: -L${libdir} -lrtmp -lz 改: Libs: -L${libdir} -lrtmp -lz -lpolarssl 至確編譯ffmpeg 轉