ffmpeg静态编译定制功能

武, 军/ 十月 23, 2017/ ffmpeg, Linux, ubuntu

目标是编译出一个ffmpeg可执行程序,代码体积尽量小,功能:
(1)采集原始视频yuv格式
(2)压缩成mp4格式
(3)可以解压mp4格式成yuv
(4)可以直接录制mp4
1.源码下载
http://ffmpeg.org/releases/ffmpeg-3.4.tar.bz2

2.解压源码(在ubuntu或者开发板上linux环境下)
tar -jxf ffmpeg-3.4.tar.bz2; cd ffmpeg-3.4;

3.创建安装目录
mkdir install;

3.配置选项
./configure –disable-ffplay –disable-ffprobe –disable-ffserver –disable-doc –disable-debug \
–prefix=./install –disable-shared –enable-static \
–enable-thumb –enable-neon –extra-cflags=”-mthumb -mfpu=neon -mfloat-abi=hard” \
–disable-indevs –disable-outdevs –disable-bsfs –disable-protocols –disable-filters \
–disable-encoders –disable-decoders –disable-muxers –disable-demuxers –disable-parsers \
–enable-protocol=file \
–enable-encoder=rawvideo –enable-encoder=mpeg4 \
–enable-decoder=rawvideo –enable-decoder=mpeg4 –enable-decoder=movtext \
–enable-muxer=aiff –enable-muxer=h263 –enable-muxer=mp4 –enable-muxer=rawvideo \
–enable-demuxer=aac –enable-demuxer=aiff –enable-demuxer=h263 –enable-demuxer=mov –enable-demuxer=rawvideo \
–enable-parser=aac –enable-parser=h263 –enable-parser=mpegaudio –enable-parser=mpeg4video \
–enable-indev=v4l2 –enable-outdev=v4l2 –enable-filter=scale

配置选项解释
./configure 是一个配置脚本,配置选项特别多,可以运行./configure -h来查看有多少可配置项。
–disable-ffplay –disable-ffprobe –disable-ffserver \这三个是可执行程序,ffplay是播放器,ffserver是视频服务器
–disable-doc –disable-debug \关闭文档和debug选项
–prefix=./install –disable-shared –enable-static \指定安装目录,关闭共享库,使能静态库(缩小代码体积)
–enable-thumb –enable-neon –extra-cflags=”-mthumb -mfpu=neon -mfloat-abi=hard” \使能thumb(缩小代码体积)使能neon浮点运算,指定编译器使用neon浮点运算
–disable-indevs –disable-outdevs –disable-bsfs –disable-protocols –disable-filters \
–disable-encoders –disable-decoders –disable-muxers –disable-demuxers –disable-parsers \
这十个对应的设备,我们先全部关闭然后再放开我们需要的,主要还是为了缩小代码体积。如果没有后面的配置,ffmpeg编译出是最小的体积,只是没有任何功能。
–enable-protocol=file \使能文件协议,这个必须放开
–enable-encoder=rawvideo –enable-encoder=mpeg4 \使能编码器rawvideo对应yuv,mpeg4对应mp4
–enable-decoder=rawvideo –enable-decoder=mpeg4 –enable-decoder=movtext \使能解码器,这里需要开启movtext才能解压mp4
–enable-muxer=aiff –enable-muxer=h263 –enable-muxer=mp4 –enable-muxer=rawvideo \使能合成器
–enable-demuxer=aac –enable-demuxer=aiff –enable-demuxer=h263 –enable-demuxer=mov –enable-demuxer=rawvideo \使能分离器
–enable-parser=aac –enable-parser=h263 –enable-parser=mpegaudio –enable-parser=mpeg4video \使能解析器
–enable-indev=v4l2 –enable-outdev=v4l2 使能输入设备,输出设备(如果不使能就只能编解码不能采集视频)
–enable-filter=scale 使能过滤器,这个是用来转换yuv的格式,yuv有多种格式要互相转换。

4.编译
make -j n
使能多线程编译,加快编译速度

5.安装
make install
在install/bin下就是ffmpeg可执行程序。

6.测试
(1)采集yuv视频
./ffmpeg -y -s 640×480 -framerate 30 -r 30 -t 10 -i /dev/video1 -f rawvideo -pix_fmt yuv420p /tmp/vga_yuv420p.raw
-y 如果目标文件已经存在,覆盖掉
-s 640×480输入视频的像素
-framerate 30 视频输入源按30fps,这个不能是任意值一般是15/30/60
-r 30 每秒采集多少帧到文件,一般是与framerate相等。
-t 10 录制10秒钟
-i /dev/video1 这个要根据实际情况,摄像头是哪个设备就设定成哪个
-f rawvideo 指定格式是rawvide
-pix_fmt yuv420p 指定像素格式是yuv420p
/tmp/vga_yuv420p.raw 目标文件

命令运行结束可以找到输出文件,用yuv播放器查看。一定要指定yuv的格式。
本地没有yuv播放器,可以上传到PC播放。
tftp -p -l /tmp/vga_yuv420p.mp4 192.168.56.3
目前发现一般的摄像头默认采集到的yuv都是yuyv422的。

(2)转换格式成mp4
./ffmpeg -f rawvideo -pix_fmt yuv420p -s 640×480 -i /tmp/vga_yuv420p.raw /tmp/vga_yuv420p.mp4
-f rawvideo -pix_fmt yuv420p 指定输入格式是yuv420p
-s 640×480 输入视频的像素是640X480
-i /tmp/vga_yuv420p.raw 输入文件
/tmp/vga_yuv420p.mp4输出文件
如果本地没有播放器,可以上传到PC播放。
tftp -p -l /tmp/vga_yuv420p.mp4 192.168.56.3

(3)解mp4文件成yuv
./ffmpeg -i /tmp/vga_yuv420p.mp4 -f rawvideo -pix_fmt yuv420p /tmp/vga_yuv420p_from_mp4.raw

(4)直接录制MP4
./ffmpeg -y -s 640×480 -framerate 30 -r 30 -t 10 -i /dev/video1 /tmp/vga_yuv420p2.mp4

如果在pc上模拟和测试需要修改配置项,因为pc上没有thumb和neon
./configure –disable-ffplay –disable-ffprobe –disable-ffserver –disable-doc –disable-debug \
–prefix=./install –disable-shared –enable-static \
–disable-indevs –disable-outdevs –disable-bsfs –disable-protocols –disable-filters \
–disable-encoders –disable-decoders –disable-muxers –disable-demuxers –disable-parsers \
–enable-protocol=file \
–enable-encoder=rawvideo –enable-encoder=mpeg4 \
–enable-decoder=rawvideo –enable-decoder=mpeg4 –enable-decoder=movtext \
–enable-muxer=aiff –enable-muxer=h263 –enable-muxer=mp4 –enable-muxer=rawvideo \
–enable-demuxer=aac –enable-demuxer=aiff –enable-demuxer=h263 –enable-demuxer=mov –enable-demuxer=rawvideo \
–enable-parser=aac –enable-parser=h263 –enable-parser=mpegaudio –enable-parser=mpeg4video \
–enable-indev=v4l2 –enable-outdev=v4l2 –enable-filter=scale