欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

FFmpeg将有序帧(图片)转换成视频(解决了生成视频后播放闪烁的痛点)

程序员文章站 2021-12-30 07:17:57
引言随着目标检测算法在工程中的广泛应用,视频和批量图片的处理成为重要的环节。在对视频进行目标识别标记,主要采用opencv,每次读取一帧图像,然后送入网络,得到目标物所属类别,框的坐标信息和置信度,然后绘制到图像中,并把此帧图像实时显示。但无法保存带识别标记的视频(本人浅薄,暂且未找到opencv中合适方法)故本博客提出一种基于FFmpeg的批量标记帧图像生成视频方法。本文把识别好的每一帧图像按序号保存至某一独立文件夹,在运用FFmpeg将文件夹中的有序帧图像合成视频。FFmpeg下载与安装方法一:官...

引言

随着目标检测算法在工程中的广泛应用,视频和批量图片的处理成为重要的环节。在对视频进行目标识别标记,主要采用opencv,每次读取一帧图像,然后送入网络,得到目标物所属类别,框的坐标信息和置信度,然后绘制到图像中,并把此帧图像实时显示。但无法保存带识别标记的视频(本人浅薄,暂且未找到opencv中合适方法)故本博客提出一种基于FFmpeg的批量标记帧图像生成视频方法。本文把识别好的每一帧图像按序号保存至某一独立文件夹,在运用FFmpeg将文件夹中的有序帧图像合成视频。

FFmpeg下载与安装

方法一:官网下载(非常慢)

FFmpeg官方下载地址

方法二:我在外网下载好,提供网盘链接

链接:ffmpeg-20200628-4cfcfb3-win64-static.zip
提取码:mmtx

安装FFmpeg

下载zip文件,解压,把bin目录下的ffmepg.exe,所在路径加入到系统环境变量path中,即可。参考博客

验证安装成功

win + R 打开,输入cmd,打开终端
输入ffmpeg -version
出现下图,安装成功。
FFmpeg将有序帧(图片)转换成视频(解决了生成视频后播放闪烁的痛点)

探索解决方案

在对监控视频取帧进行目标识别+存储有序帧后,先后从两大方向,多个角度尝试,皆效果不理想。

  1. 运用opencv来实现有序帧转视频(转换后的视频播放出现帧间闪烁)
  2. 用Win10自带视频编辑器处理(手动调节每一帧播放时间,费时费力)
  3. 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