3個平臺下的ffmpeg——ffmpeg編譯
ffmpeg編譯
需要在3個平臺(win\linux\arm)下使用ffmpeg的庫,所以進行了ffmpeg的編譯。
其中ffmpeg的編譯也有許多依賴,不同平臺依賴的也不一樣,少了一個依賴可能就少了一個功能了。
Windows下的ffmpeg:
Win下的ffmpeg就懶得編譯了,因為官網已經有現成的了。
Linux下的ffmpeg:
ffmpeg沒有自帶h264的編碼庫最起碼會用到libx264,這個可以去網上下載last_stable_x264.tar.bz2。下面還有加入librtmp的編譯。
解壓成目錄x264_stable
####進入x264-stable裡
./configure --prefix=/usr/local/x264 --enable-shared --enable-static --enable-yasm
make
make install
####編譯ffmpeg:::::
sudo ./configure --enable-shared --disable-static --disable-yasm --enable-libx264 --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --enable-librtmp --prefix=/home/linux/Work/ffmpeg3.2_linux --extra-cflags=-I/usr/local/x264/include --extra-ldflags=-L/usr/local/x264/lib
make
make install
###成功後,
去執行./ffmpeg 錯誤,缺少ffmpeg庫,在/etc/ld.so.conf 里加上路徑,然後sudo ldconfig
之後還錯誤,缺少libx264.so.xxx庫,這個要軟連過去::
ln -sf /usr/local/x264/lib/libx264.so.148 /usr/lib/libx264.so.148
可以成功執行ffmpeg.
可以成功執行程式:
gcc -o runtest test.c -lpthread -lm -I. -L./lib_ffmpeg/lib -lavcodec -lavdevice -lavfilter -lavformat -lavutil -lpostproc -lswscale -lswresample
如果程式出現但是出現錯誤
[h264_nvenc @ 0x1bb8160] Cannot load libcuda.so.1。
那就是還沒編譯進x264
----重新編譯ffmpeg 連結librtmp
主要步驟:(他的是把librtmp 編成靜態庫,整合到ffmpeg中)
cd rtmpdump
cd librtmp
gedit Makefile::
prefix=3RDLIB_INSTALL_PATH
...
#CRYPTO=OPENSSL
CRYPTO=
...
#SO_LDFLAGS_posix=-shared -Wl,-soname,[email protected]
SO_LDFLAGS_posix=-Wl,-soname,[email protected] //////////這裡可能沒有,已經寫在下面的編譯裡了。
...
#SHARED=yes
SHARED=no
make
cd .. (返回上一級目錄)
make SYS=posix XDEF=-DNO_SSL CRYPTO= SHARED= (這裡參考了README,SYS=posix)
make install
編譯ffmpeg:
註釋了configure裡的 enable librtmp 一行,加入一些編譯項:
sudo ./configure --enable-shared --enable-static --disable-yasm --enable-libx264 --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-postproc --enable-pthreads --enable-librtmp --prefix=/home/linux/Work/ffmpeg3.2_linux --extra-cflags="-I/usr/local/librtmp/include -I/usr/local/x264/include" --extra-ldflags="-L/usr/local/librtmp/lib -L/usr/local/x264/lib" --extra-libs="-lrtmp -lx264"
////之前一直不成功,是因為下錯了librtmp,導致一直找不到RTMP_Socket ,現在使用的版本為2.3
sudo make
sudo make install
arm下的ffmpeg:
首先,arm下的ffmpeg將來會用到很多功能,例如編解碼,網路媒體流等等,所以我編譯了很多依賴進去。尤其是想要推流rtmp 必須編譯librtmp進去,否則推流會失敗。
依賴的庫有x264、librtmp、xvidcore
由於x264 和librtmp也要交叉編譯。
X264::
1) [[email protected] x264]# ./configure --enable-pthread --enable-static --enable-shared --host=arm-linux --disable-asm
2)修改config.mak
SRCPATH=.
prefix=/usr/local/x264_arm
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
SYS_ARCH=ARM
SYS=LINUX
CC=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gcc
CFLAGS=-Wshadow -O3 -ffast-math -Wall -I. -I$(SRCPATH) -std=gnu99 -D_GNU_SOURCE -fomit-frame-pointer -fno-tree-vectorize
COMPILER=GNU
COMPILER_STYLE=GNU
DEPMM=-MM -g0
DEPMT=-MT
LD=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gcc -o
LDFLAGS= -L/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/lib -lm -L/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/lib -lpthread -L/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/lib -ldl
LIBX264=libx264.a
AR=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-ar rc
RANLIB=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-ranlib
STRIP=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-strip
make
sudo make install
成功。
###
librtmp::
首先要編譯兩個依賴庫有 zlib 和 openssl,所有的庫都可以在其官網下載。
openssl:
./config CC=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gcc --prefix=/usr/local/openssl_arm
sudo make
sudo make install
zlib:
sudo ./configure
修改Makefile:
CC=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gcc
LDSHARED=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gcc -E
AR=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-ar
ARFLAGS=rc
RANLIB=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-ranlib
prefix =/usr/local/zlib_arm
sudo make
sudo make install
成功。
依賴庫成功後,正式開始編譯librtmp:
////之前一直不成功,是因為下錯了librtmp,導致一直找不到RTMP_Socket ,現在使用的版本為2.3
修改 librtmp/Makefile:::
prefix=/usr/local/librtmp_arm
XCFLAGS=-I/usr/local/include -I/usr/local/zlib_arm/include -I/usr/local/openssl_arm/include -L/usr/local/lib -L/usr/local/zlib_arm/lib -L/usr/local/openssl_arm/lib
CROSS_COMPILE=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-
SYS=posix
CRYPTO=OPENSSL
#SHARED=yes
SHARED=no
然後make 這個Makefile檔案
再修改 原始碼根目錄下的Makefile
prefix=/usr/local/librtmp_arm
XCFLAGS=-I/usr/local/include -I/usr/local/zlib_arm/include -I/usr/local/openssl_arm/include
XLDFLAGS=-L/usr/local/lib -L/usr/local/zlib_arm/lib -L/usr/local/openssl_arm/lib
CROSS_COMPILE=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-
SYS=posix
#SYS=mingw
CRYPTO=OPENSSL
make SYS=posix CROSS_COMPILE=arm-hisiv200-linux- INC=-I/usr/local/include XDEF=-DNO_SSL CRYPTO= SHARED=
sudo make install
成功!
####
Libxvidcore :
開始編譯ffmpeg:
這裡依賴x264、librtmp、xvidcore、 libz、libcrypto、libssl ,後兩個都在openssl 裡::
sudo ./configure --enable-cross-compile --target-os=linux --arch=arm --enable-shared --disable-static --disable-yasm --enable-libx264 --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-postproc --enable-libxvid --enable-pthreads --enable-librtmp --prefix=/home/linux/Work/ffmpeg3.2_hi200so --extra-cflags="-I/usr/local/librtmp_arm/include -I/usr/local/x264/include -I/usr/local/include -I/usr/local/openssl_arm/include -I/usr/local/zlib_arm/include -I/usr/local/xvid_arm/include" --extra-ldflags="-L/usr/local/librtmp_arm/lib -L/usr/local/x264/lib -L/usr/local/lib -L/usr/local/openssl_arm/lib -L/usr/local/zlib_arm/lib -L/usr/local/xvid_arm/lib" --extra-libs="-lrtmp -lx264 -ldl -lssl -lcrypto -lz -lxvidcore" --cc=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-gcc
出錯:
之前我編譯的時候會出錯:
arm-hisiv200-linux-gcc is unable to create an executable file.
C compiler test failed.
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 "config.log" produced by configure as this will help
solve the problem.
》》》方法是要加入工具鏈的庫,在/usr/local/lib 裡,連結 上 -ldl
期間出現什麼未找到,未定義,都是庫路徑或者沒有加入該庫。
還有出現的C compiler test failed.
都是工具鏈gcc路徑不對,工具鏈沒有加入標頭檔案和庫,沒有加入 -ldl
或者加入的x264、librtmp、xvidcore、 libz、libcrypto、libssl等沒有交叉編譯。
然後要修改config.mak
AR=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-ar
RANLIB=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-ranlib
STRIP=/opt/hisi-linux/x86-arm/arm-hisiv200-linux/target/bin/arm-hisiv200-linux-strip
只用修改這裡
然後
sudo make
sudo make install
成功。
在arm上執行,缺少庫的話,都複製放在ffmpeg的lib裡。執行./ffmpeg 成功》
出錯:
之前我執行程式錯誤:
Assertion v>0 && v<=(0 ? 32 : 16) failed at libavutil/mem.c:233
av_packet_free這裡出錯,
百度了:根據上述程式碼段,在FFmpeg編譯configure時,嘗試了將-enable-memalign-hack 選項去掉,發現能正常工作了。不過,暫時還不清楚為什麼會這樣~~~
從av_packet_free(&Gparg->v_queue->avPacket[i]); 改回free就不報錯。
在板子上ffmpeg,發現編譯選項裡多了-enable-memalign-hack 這個選項,居然是我手動加入的......重新編譯去掉這個選項,程式就不會出錯了。