ffmpeg可执行程序裁剪

需求

最近我们在嵌入式板子上有一个需求,拉取网络摄像头的rtsp流保存为jpg/png图片,我们准备借助ffmpeg命令行工具去完成,命令行实现这个功能很简单,但是编译出的ffmpeg可执行程序的大小很大,因此我们尝试对ffmpeg可执行程序进行编译裁剪,最终我们发现按照下面方法后进行裁剪后的大小只有之前的1/4不到,解决了我们遇到的问题。

实现

编译ffmpeg的步骤包括下面三步

  1. ./configure  --prefix=/your/install/dir
  2. make -j8
  3. make && make install

因为ffmpeg是组件化的,所以我们的裁剪思路是仅仅使能我们需要的组件,禁用其他的组件,这是通过修改第一步的configure参数实现的,最终我们的参数如下

  1. ./configure --prefix=/mnt/d/linux/FFmpeg-release-6.1/install --disable-everything --enable-demuxer=rtsp --enable-parser=h264 --enable-parser=hevc --enable-decoder=h264 --enable-decoder=hevc --enable-filter=scale --enable-encoder=mjpeg --enable-encoder=png --enable-muxer=image2 --enable-protocol=file

下面解释下里面使用参数的含义

  • --disable-everything  禁用所有的组件,包括封装/解封装、parse、编解码、过滤器等。
  • --enable-demuxer=rtsp 因为我们是从rtsp拉流,而ffmpeg把rtsp作为一个封装来处理,所以我们要添加对rtsp解封装的支持。
  • --enable-parser=h264 --enable-parser=hevc  当前摄像头的视频编码可选的配置是H264/h265(也就是hevc),但是rtsp解封装后仅仅拿到了视频流(和音频流),视频流到视频帧还需要parse的处理,因此这里添加h264、hevc的parse。
  • --enable-decoder=h264 --enable-decoder=hevc  拿到h264/h265视频帧后就需要进行h264/h265的解码了,因此这里要添加h264、hevc解码器。
  • --enable-filter=scale h264/h265解码后得到的原始视频像素格式通常是yuv420p,而jpg编码要求的输入像素格式通常是yuvj420p、png编码要求的输入像素格式通常是RGB,所以在编码前需要进行像素格式转换,因此我们添加scale过滤器。
  • --enable-encoder=mjpeg  jpg图片需要添加mjpeg编码器
  • --enable-encoder=png png图片需要添加png编码器
  • --enable-muxer=image2 添加image2封装来对jpg、png图片进行支持
  • --enable-protocol=file  因为我们要生成的是一个本地文件,所以需要添加file协议

因为我们不需要对音频进行处理,所以上面参数里面没有涉及到音频部分。此外有时我们可能一下子不能将参数全部写对,但我们可以用生成的命令行工具去验证并根据验证出现的报错信息进行修改。另外./configure命令支持的所有可选参数我们可以通过./configure --hep获得,如下图所示,上面使用的参数都可以看到,我们也可以使用/configure [--list-decoders|--list-demuxers|--list-parsers]等来查看ffmpeg支持哪些组件。

ffmpeg可执行程序裁剪_第1张图片ffmpeg可执行程序裁剪_第2张图片

你可能感兴趣的:(ffmpeg,ffmpeg)