ffmpeg静态编译,定制功能,尽量缩小可执行程序体积

来源:互联网 发布:生化危机解析知乎 编辑:程序博客网 时间:2024/06/07 21:48

目标是编译出一个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 640x480 -framerate 30 -r 30 -t 10 -i /dev/video1 -f rawvideo -pix_fmt yuv420p  /tmp/vga_yuv420p.raw
-y 如果目标文件已经存在,覆盖掉
-s 640x480输入视频的像素
-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 640x480 -i /tmp/vga_yuv420p.raw /tmp/vga_yuv420p.mp4
-f rawvideo -pix_fmt yuv420p 指定输入格式是yuv420p
-s 640x480 输入视频的像素是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 640x480 -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
原创粉丝点击