之前几篇完成了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图片了。