背景
為了把ijkplayer中的視頻流到文件的保存,嘗試對AVFrame
進行encode操作,然后保存成對應的視頻文件,完成視頻的錄制。
遇到的問題
一直找不到對應的編碼器,encoder = avcodec_find_encoder(dec_ctx->codec_id);
一直返回NULL
。
解決方案
查看ijkplayer的配置,發現其并未集成對應的編碼器,因此需要我們自己集成編碼器(x264)到ijkplayer中。
實現過程
x264的準備工作
1.下載x264
x264官網 下載x264源碼,將其文件夾名稱改為x246。
2.下載gas-preprocessor
需要將x264編譯成RAM平臺的版本,需要此文件。下載gas-pregprcessor,將其中的gas-preprocessor.pl
文件放到/usr/local/bin
文件夾下面。然后修改其權限使其可以運行chmod u+x gas-preprocessor.pl
。
sudo cp gas-preprocessor.pl /usr/local/bin
cd /usr/local/bin
sudo chmod u+x gas-preprocessor.pl
3.下載x264 build shell
下載build-x264.sh 將文件build-x264.sh放在x264同一級目錄里面,注意不是放在x264文件夾里面。
修改其權限,添加運行權限
sudo chmod u+x build-x264.sh
,然后執行腳本即可完成x264的交叉編譯。
sudo ./build-x264.sh
完成編譯后會生成x264-iOS文件夾,里面就是我們已經編譯好了的包。
4.將編譯好的x264放到系統路徑下面
- 將x264-iOS文件夾下include中的頭文件移到
/usr/local/include
中
sudo cp include/* /usr/local/include
- 將x264-iOS文件夾下lib中的文件移到
/usr/local/lib
中
sudo cp lib/* /usr/local/lib
重新編譯ijkplayer
我們需在編譯ffmpeg的時候加上x264,因此需要修改ijkplayer文件中./config/module.sh
文件配置。(我用的是module-lite.sh文件)
添加修改部分配置如下,在第9行的位置修改如下
# Licensing options:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-gpl"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-libx264"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=libx264"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-version3"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-nonfree"
# Configuration options:
修改第69行,把export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-encoders"
改為
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoders"
然后重新編譯ijkplayer。
cd ios/
./compile-ffmpeg clean
./compile-ffmpeg all
編譯完了將x264-iOS/lib中的libx264.a
文件復制到ijkplayer中的./ios/build/universal/lib
中
最后在工程中引入libx264.a的包即可。
這樣就完成了ijkplayer中x264編碼庫的集成,就可以對AVFrame進行編碼操作了,愉快的去(too young too simple)完成視頻的錄制。