之前幾篇完成了V4L2的學習,通過V4L2我們能夠采集到了YUYV的視頻數據,不過可以看到直接傳輸YUV格式的數據,數量量是巨大的,網絡延時嚴重。所以我們需要對YUV數據進行壓縮編碼。
目前主流的視頻編碼有h.264/h.265/vp9/AVS/AV1等等,這邊我們以最常見最經典的h.264格式來壓縮視頻。基於學習的目的,我們通過x265開源編碼庫來壓縮,可以直接通過調用x264庫來實現,也可以通過FFmpeg來間接調用x264,為了后續FFmpeg的學習,我們直接使用FFmpeg來調用。所以,首先需要先配置FFmpeg、x264的環境。
一、編譯x264
源碼地址:git clone https://code.videolan.org/videolan/x264.git
配置編譯環境:./configure --enable-static --disable-asm --prefix=/home/hank/Desktop/share/x264/out
./configure --enable-static --disable-asm --prefix=/home/hank/Desktop/share/x264/out --disable-opencl (最新版本需要去使能opencl,見FFmpeg編譯)
其中 --enable-static表示需要生成靜態庫, 如果想生成靜態庫,改為--enable-shared; --prefix指定安裝目錄,make install以后會吧頭文件/庫等產物放到該路徑。
make;make install;
等待編譯完成后,可以看到安裝路徑下已經有產物,產物為x264可執行程序,include對外API頭文件,lib路徑中的靜態庫等。
看下x264版本信息:
二、編譯FFmpeg
① 源碼地址:git clone git@github.com:FFmpeg/FFmpeg.git
可以看到FFmpeg庫已經比較龐大了
② 配置編譯環境:如下圖所示,配置FFmpeg, --enable-static表示生產靜態庫;--enable-libx264表示使能外部libx264 --enable-gpl開啟libx264必須使能gpl協議。--extra-cflags和 --extra-ldflags指定libx264對應產物路徑。
./configure --prefix=/home/hank/Desktop/share/ffmpeg/out --extra-cflags=/home/hank/Desktop/share/x264/out/include --extra-ldflags=/home/hank/Desktop/share/x264/out/lib
運行./build.sh以后有如下報錯:
google了下,目前最新的libx264需要配置--disable-opencl,以使FFmpeg能找到庫,所以返回第一步重新配置編譯libx264,然后運./build.sh,配置成功。
配置完成FFmpeg,可以看到已經成功找到了libx264庫:
make;make install
③ 編譯產物
可看到make install以后在指定的路徑下面生產了頭文件/靜態庫/可執行程序等產物。
查看FFmpeg版本:
以上完成了FFmpeg+libx264的環境配置,接下去就可以使用FFmpeg/libx264的庫和API來壓縮編碼V4L2采集的YUV圖片了。