1. 程式人生 > >3個平臺下的ffmpeg——ffmpeg編譯

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=  (這裡參考了READMESYS=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進去,否則推流會失敗。

依賴的庫有x264librtmpxvidcore

由於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:

這裡依賴x264librtmpxvidcorelibzlibcryptolibssl ,後兩個都在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

或者加入的x264librtmpxvidcorelibzlibcryptolibssl等沒有交叉編譯。

然後要修改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上執行,缺少庫的話,都複製放在ffmpeglib裡。執行./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 這個選項,居然是我手動加入的......重新編譯去掉這個選項,程式就不會出錯了。