1. 程式人生 > >linux下采用PNacl編譯ffmpeg4.1

linux下采用PNacl編譯ffmpeg4.1

filter 碼流 int 討論 只需要 libc entos 初步 setrlimit

一、發此文的目的

1、對於想通過在chrome瀏覽器上通過插件的方式跑視頻的話,可以解決有無的問題。

2、對於本文提到的問題歡迎有經驗的大神給予指導。

二、為什麽要做這個事情

由於工作關系,需要在chrome瀏覽器上實現一個播放視頻監控的插件。插件架構選擇PNacl,通過對nacl-sdk自帶的pp::VideoDecoder進行測試後發現,它非常不穩定,跑rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov,幾秒後幀解碼就不正常了,圖像出不來了,如果跑高分辨率的監控的話,連一個圖片也解碼不出來,通過對chromium項目的初步研究,pp::VideoDecoder在解碼時如果是h.264的話也是ffmpeg參與的解碼。折騰了好久,也不知道問題出在哪裏,如果有哪位大神踩過這個坑,歡迎溝通討論。

後面轉換思路,拋棄掉nacl-sdk自帶的解碼功能,采用ffmpeg進行解碼,後面取得了成功。下面對過程做一記錄,並對可能出現的問題作一個說明。

三、原材料準備

1、CentOS 6.8 X64

2、nacl_sdk linux版(如何獲取nacl_sdk不在此討論)

3、GLIBC要升級到2.15

4、Python2.7(編譯插件的時候需要)

5、ffmpeg4.1

四、安裝nacl_sdk

只需要設置環境變量即可:

NACL_SDK_ROOT=/home/nacl_sdk/pepper_49
export NACL_SDK_ROOT
PATH=$PATH:/home/nacl_sdk/pepper_49/toolchain/linux_pnacl/bin

五、編譯ffmpeg

進入到ffmpeg-4.1目錄,執行如下命令

./configure \
--target-os=linux \
--arch=pnacl \
--prefix="$NACL_SDK_ROOT/toolchain/linux_pnacl/le32-nacl/usr" \
--cross-prefix=pnacl- \
--cc=pnacl-clang \
--ld=pnacl-clang++ \
--enable-static
make
make install

編譯完成後,在$NACL_SDK_ROOT/toolchain/linux_pnacl/le32-nacl/usr目錄下面會有7們le-32架構的靜態庫,供二次開發使用。

libavcodec.a
libavdevice.a
libavfilter.a
libavformat.a
libavutil.a
libswresample.a
libswscale.a

六、在編譯過程中可能遇到的問題

1、libavformat/codec2.c:22:10: fatal error: ‘memory.h‘ file not found
在ffbuild/config.mak文件裏面找到CFLAGS,增中頭文件依賴-I/home/nacl_sdk/pepper_49/include/pnacl

修改後的樣子為:

CFLAGS= -std=c11 -fomit-frame-pointer -pthread -g -Wdeclaration-after-statement -Wall -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes -Wempty-body -Wno-parentheses -Wno-switch -Wno-format-zero-length -Wno-pointer-sign -Wno-unused-const-variable -O3 -fno-math-errno -fno-signed-zeros -Werror=implicit-function-declaration -Werror=missing-prototypes -Werror=return-type -I/home/nacl_sdk/pepper_49/include/pnacl
2、fftools/cmdutils.c:1072:19: error: variable has incomplete type ‘struct rlimit‘
找到opt_timelimit函數在
#if HAVE_SETRLIMIT後面增加 && !defined(__pnacl__)
修改後的樣子是:
#if HAVE_SETRLIMIT && !defined(__pnacl__)
3、fftools/ffmpeg.c:4800:5: error: implicit declaration of function ‘getrusage‘ is invalid in C99
找到get_benchmark_time_stamps函數在#if HAVE_GETRUSAGE後面增加&& !defined(__pnacl__)
修改後的樣子:
#if HAVE_GETRUSAGE && !defined(__pnacl__)

七、需要說明的問題

1、ffmpeg的靜態庫當中的網絡連接功能不能使用,即avformat_open_input是不能使用的。測試過程中一直返回錯誤,推測可能是由於chrome的沙箱的攔截造成的,網絡部分需要通過nacl_sdk的pp::HostResolver、pp::TCPSocket(或者pp::UDPSocket)自己實現才能解決。但是靜態庫的解碼功能是正常可以使用。

八、未來需要解決的問題

1、播放過程中有花屏現象(原因不明)效果如下圖所示:

技術分享圖片

經過測試,相同版本的ffmpeg在編譯出來的windows的dll庫上是不存在此問題的,不知道是不是與pnacl不支持匯編,而ffmpeg有匯編代碼有關,歡迎大神們解惑。

2、不支持高清分辨率的視頻

經過測試,如果是高清的主碼流可以很好的播放,但是如果是主碼流1080p的rtsp的話播放會出現花屏和條帶現象。

linux下采用PNacl編譯ffmpeg4.1