FFmpeg将有序帧(图片)转换成视频(解决了生成视频后播放闪烁的痛点)
引言
随着目标检测算法在工程中的广泛应用,视频和批量图片的处理成为重要的环节。在对视频进行目标识别标记,主要采用opencv,每次读取一帧图像,然后送入网络,得到目标物所属类别,框的坐标信息和置信度,然后绘制到图像中,并把此帧图像实时显示。但无法保存带识别标记的视频(本人浅薄,暂且未找到opencv中合适方法)故本博客提出一种基于FFmpeg的批量标记帧图像生成视频方法。本文把识别好的每一帧图像按序号保存至某一独立文件夹,在运用FFmpeg将文件夹中的有序帧图像合成视频。
FFmpeg下载与安装
方法一:官网下载(非常慢)
方法二:我在外网下载好,提供网盘链接
链接:ffmpeg-20200628-4cfcfb3-win64-static.zip
提取码:mmtx
安装FFmpeg
下载zip文件,解压,把bin目录下的ffmepg.exe,所在路径加入到系统环境变量path中,即可。参考博客
验证安装成功
win + R 打开,输入cmd,打开终端
输入ffmpeg -version
出现下图,安装成功。
探索解决方案
在对监控视频取帧进行目标识别+存储有序帧后,先后从两大方向,多个角度尝试,皆效果不理想。
- 运用opencv来实现有序帧转视频(转换后的视频播放出现帧间闪烁)
- 用Win10自带视频编辑器处理(手动调节每一帧播放时间,费时费力)
- PR视频剪辑软件生成(对帧的序号有严格要求,如000.jpg、001.jpg·······199.jpg)(而我在目标识别后保存的序号是1.jpg、2.jpg、3.jpg ···50.jpg、51.jpg···198.jpg、199.jpg;是按数字递增的并没有保持序号宽度一致)
当然,python熟练的可以在保存帧的时候,统一命名为序列宽度一致,并保存。
最终解决方案
运用FFmpeg针对有序帧转化为视频。
前提准备
安装好ffmpeg
带有有序标号的标记好的帧图像的文件夹(我的有序命名为 fram1.jpg、fram2.jpg、fram3.jpg···fram712.jpg )
命令行输入指令
当运用ffmpeg压缩视频时,推荐用libx264编码格式,根据经验,这样得到的视频,分辨率体积小。不同版本的ffmpeg会得到不同的输出文件。
例如文件夹中图像格式(fram1.jpg, fram2.jpg…. etc)此时运用以下指令:
ffmpeg -r 60 -f image2 -s 1920x1080 -i fram%d.jpg -vcodec libx264 -crf 25 -pix_fmt yuv420p test.mp4
主要修改 帧率、输入图片帧命名格式、输出
%04d 表示用零来填充直到长度为4,i.e 0001…0020…0030…2000 and so on.
如果没有填充,需要相应更改,如 pic%d.png or %d.png
-r 帧率(fps)
-f image2 图像合成视频默认设置
-crf 画质,数值小意味着画质高,通常设置为15-25
-s 分辨率(1920x1080)
-pix_fmt yuv420p 像素格式
test.mp4 输出在当前文件夹,输出结果为test.mp4
参考资料
[1]https://blog.csdn.net/kaikai136412162/article/details/80746961
[2]http://hamelot.io/visualization/using-ffmpeg-to-convert-a-set-of-images-into-a-video/
本文地址:https://blog.csdn.net/weixin_37939906/article/details/107281060