前言

本文介绍了利用FFmpeg进行视频测试序列制作的方法。所谓测试序列就是将若干个不同场景的视频片段,按照不同的分辨率、码率、编码方法等进行处理,然后拼接成一条长视频,供测试者打分。一般包括以下几个步骤:视频截取、采样/编码/转码、黑帧/灰帧制作、视频拼接、视音频融合等。

  • 前言
  • 一视频截取
  • 二采样和编码
  • 三黑帧灰帧的制作
  • 四视频拼接
    • 1 先音视频片段融合再拼接
    • 2 先视音频片段分别拼接得到长视频和长音频再将二者融合
  • 后记

一、视频截取

截取视频之前,一般要先获取原始高清视频,可以到Youtube、Gopro等网站下载,商用的话请注意版权问题,或者可以自己录制视频。然后浏览获取到的视频,确定要截取的片段后,可利用FFmpeg截取。比如要截取名为input.mp4的视频1分20秒至1分40秒的片段,命令如下:

ffmpeg -i %input_path%\input.mp4 -ss 00:01:20 -t 00:00:20 %output_path%\output.mp4

上述命令中,-i为输入的文件,-ss 即为起始时间,-t为截取长度,这两个时间可以用 hh:mm:ss 的格式,也可以直接用秒,如 00:01:20 可写成 80。另外,时间还可以精确到毫秒级,比如可以截取20.358秒的长度,虽然实际截出来不会那么精确。

二、采样和编码

截取出来的视频片段,若想重新编码到其他分辨率、码率的话,一般要先转为YUV格式(此后会丢失音频,因为yuv不存储音频),因为YUV格式是把每一帧的图像用亮度和色度分开表示的格式,所以压缩时容易去掉色度的数据;之后将原始yuv采样到目标分辨率,接着对yuv进行x264编码得到.264文件,最后将.264文件封装成MP4等格式。各步骤命令大致如下:
MP4转YUV:

ffmpeg -i %input_path%\input.mp4 %output_path%\output.yuv

对YUV采样(假设原始分辨率为3840x1920,目标分辨率为1920x960):

ffmpeg -s 3840x1920 -i %input_path%\input_3840x1920.yuv -s 1920x960 %output_path%\output_1920x960.yuv

其中-s依次为原始分辨率和目标分辨率。
对采样后的YUV进行x264编码(应先下载x264源码编译得到x264.exe):

x264.exe -I %MAX_GOP_SIZE% -i %MIN_GOP_SIZE% --ref 1 --qpstep 2 --profile baseline --bitrate %bitrate% --vbv-maxrate %bitrate% --vbv-bufsize %output_path%\output.264 %input_path%\input.yuv --input-res %input_resolution%

.264文件封装为MP4:

ffmpeg -i %input_path%\input.264 %output_path%\output.mp4

至此,可将各视频素材编码到目标分辨率和码率。编码器可替换成其他,x264是我本次项目用的。

三、黑帧/灰帧的制作

制作视频测试序列时,测试片段之间应该留有10秒左右时间间隙给测试者打分,此时一般使用黑帧或者灰帧过渡,目前行业内逐渐使用灰帧代替黑帧。黑帧的话,可以截取电影片段,或者自己录制,方法比较多。灰帧不好找,所以一般使用代码产生若干帧YUV,然后根据所需长度、分辨率、帧率等编码得到灰帧视频。无论黑帧/灰帧,无论何种方法,建议务必保证它们的质量足够好,不然可能无法拼接,或者能拼接但在解码播放时出问题。我一开始拿的两个短黑帧视频拼出一个10秒长的,拿去拼接时经常出问题,浪费了不少精力。
从YUV编码得到一个灰帧视频后,可以利用这个视频来转换得到其他分辨率的,没必要对原YUV采样几次,毕竟灰帧的质量要求没有测试片段高。ts格式视频转分辨率命令如下,其他格式亦可依样画葫芦:

ffmpeg -i %input_path%\gray_3840x1920.ts -s 1920x960 -vcodec copy %output_path%\gray_1920x960.ts

其中,-s是目标分辨率,-vcodec copy 意为使用原视频的编码方式,一般不更改编码方式的话,都最好附上这个参数,能够避免不少意外。去掉-vcodec copy 也能转分辨率,输出的文件也能正常播放,但拿去拼接的时候会出错。

四、视频拼接

用来拼接到同一序列的视频片段们,分辨率最好是一样的,帧率不必一样,码率随意。ffmpeg拼接视频之前,需要把视频转为.ts格式。拼接有两条思路:一是先将个视频片段与其对应的音频融合再拼接,二是将视频片段和音频片段分别拼接,再将得到的长视频序列和长音频序列融合。

4.1 先音视频片段融合再拼接

先从截取得到的有声MP4视频片段中提取音频:

ffmpeg -i input.mp4 -vn -acodec copy output.aac

其中,-vn意为屏蔽视频信息,只获取音频;-acodec copy意为复制原音频的编码方式。(ps,若要提取视频,命令为:ffmpeg -i input.mp4 -an -vcodec copy output.mp4 )
接着将音视频片段融合产生可用来拼接的.ts文件:

ffmpeg -i input_v.mp4 -i input_a.aac -vcodec copy -acodec copy output.ts

最后,将前面得到的有声ts视频和灰帧ts视频 gray.ts 拼接成一条长视频:

ffmpeg -i "concat:%path1%\video1.ts|%gray_path%\gray.ts|%path2%\video2.ts|%gray_path%\gray.ts|... ...|%pathN%\videoN.ts|%gray_path%\gray.ts" -vcodec copy -acodec copy -bsf:a aac_adtstoasc %output_path%\output.mp4

其中,-vcodec copy 意为复制原视频编码方式, -acodec copy 意为复制原音频编码方式,-bsf:a aac_adtstoasc 是一个bitstream filter,不加的话,会提示无法音视频融合。
至此,一个有声的视频测试序列就完成了!

4.2 先视音频片段分别拼接得到长视频和长音频,再将二者融合

视频片段拼接:

ffmpeg -i "concat:%path1%\video1.ts|%gray_path%\gray.ts|%path2%\video2.ts|%gray_path%\gray.ts|... ...|%pathN%\videoN.ts|%gray_path%\gray.ts" -vcodec copy %output_path%\output.mp4

在进行音频片段拼接之前,需要先获取静音音频,时长等于灰帧时长。一般可以用软件产生,比如用cool edit pro,产生静音pcm,然后把pcm转为aac。FFmpeg也能完成音频拼接,命令格式和视频拼接相似,但是在我的实验过程中,ffmpeg拼接出来的长音频会比各音频片段相加的总和还长,总长度为15分钟整的音频片段们,拼接后长度为15分8秒!和视频融合后,音视频严重不同步。所以我后来使用的是另一个软件:音频编辑专家。效果良好,而且能自动统一各片段的音量,很不错的功能。
之后长视频和长音频融合,可以使用ffmpeg实现:

ffmpeg -i %input_path%\input_video.mp4 -i %input_path%\input_audio.aac output.mp4

也可以使用MP4box实现,软件 YAMB 中有交互界面可以方便高效地实现。这个软件的其他功能也相当实用。
在上述两种拼接方法中,第一种方法的优点是音视频同步非常好,而且只需拼接一次,比较省事。第二种方法的好处是思路简单,成功率高。我是在尝试第一种方法失败,而且折腾数日无果后,才退而求其次采用第二种方法。不过现在想来应该是我当时使用的黑帧视频质量太差,或者是黑帧转分辨率编码时没加上-vcodec copy之类的参数。我实验室的师姐向来都用的第一种方法,一直没什么问题。

后记

我是在研二师兄师姐们忙于找工作,无暇兼顾项目工作之时,接手了这个任务。此时的我本科刚毕业,对批处理只有朦胧印象,对视频编码也知之甚少,对FFmpeg则是一无所知。一周左右的时间里,我匆忙学习了批处理,照着前人的实现方法写批处理文件调用ffmpeg去实现。遇到许多问题,有些原始MP4文件头无法被FFmpeg识别,截取不了;有个别YUV文件无法使用ffmpeg进行下采样;转码后视频长度变化;来自于同一片段的音视频长度不相等;拼接后音视频不同步,等。尝遍了各种失败的方法,个中艰苦,非三言两语所能道明。不过现在想来,觉得几天前的自己太傻,这么简单的任务应该两天能做完。这大概也是一种进步吧,快乐。细心很重要,批处理简单实用,FFmpeg极其强大。

利用FFmpeg制作视频序列相关推荐

  1. Mac OS中利用ffmpeg为视频添加字幕

    Mac系统下,利用ffmpeg加字幕 字幕类型 硬字幕,类似视频水印,作为视频的一部分内嵌了. 软字幕,封装字幕,也是内嵌到视频里,不过只是作为渲染,而且需要播放器支持才行. 外挂字幕,就是外部字幕文 ...

  2. 利用ffmpeg对视频文件进行分析几例

    1.将视频文件转换为jpg图片文件序列: ffmpeg -i /home/czl/WorkSpace/ffmpeg/H264_REC.raw -r 1 -q:v 2 -f image2 pic-%03 ...

  3. 项目:私“图”定制——利用ffmpeg制作Gif

    目录: 项目背景 可行性方面 需求分析 详细设计 测试 维护 项目效果图展示 完整代码 项目背景: 文字信息时代,传统的文字聊天方式已不能满足大众的需求,很多时候文字不能表达自己的想法,或者沟通技巧的 ...

  4. 利用FFmpeg进行视频文件进行分割

    利用FFMPEG命令进行文件分割 ffmpeg -ss 00:00:00 -i input.mp4 -c copy -t 60 output.mp4 -ss 表示视频分割的起始时间,-t 表示分割时长 ...

  5. 利用FFMPEG进行视频分割

    转载地址:http://blog.csdn.net/bikeytang/article/details/51491139 利用FFMPEG命令进行文件分割 ffmpeg -ss 00:00:00 -i ...

  6. 利用ffmpeg替换视频的背景音乐并改变视频标题部分

    这两天又遇到一个朋友的问题,这里跟大家共享一下我利用ffmpeg的解决方法 将一个带音乐的视频的声音,消除其背景音乐,替换为另一个伴奏音乐 同时将将视频前部的15秒标题部分替换为一张标题图片 原料是一 ...

  7. 【.net】利用FFmpeg获取视频截图

    目标及工具 这里使用vb.net结合FFmpeg截取视频中的图片.本文使用的编程工具是Visual Studio Community 2022,这个版本是在官方下载的安装的纯免费使用,而且基本功能都可 ...

  8. 利用FFmpeg将视频格式.avi转换成.yuv形式

    ffmpeg -i 视频名.avi -pix_fmt yuv420p -s 1280x720 -ss 00:00:03 -t 00:00:01 -y 视频名.yuv 其中-pix_fmt yuv420 ...

  9. 利用FFMPEG 旋转视频 和制作多宫格效果

    FFmpeg 官方下载: http://ffmpeg.org/download.html 配置下环境变量,使用命令行运行,旋转视频是逆时针旋转 ffmpeg -re -i output_video_2 ...

最新文章

  1. proxmoxve打造云桌面_AIO攻略 | 桌面云是如何解决外设问题的?
  2. excel调用python编程-用Python如何开发Excel宏脚本?新手必学
  3. dos2unix批量转换的脚本
  4. Exchange2013/2016下通过RDB(恢复数据库)还原用户邮箱数据
  5. mysql服务器的HA集群之corosync+drbd+pacemaker实现 上
  6. 贝叶斯算法对文本进行分类实例
  7. java 递归改非递归_使用Java ThreadLocals的意外递归保护
  8. Product user profile information 没有导入
  9. 3.1Python数据处理篇之Numpy系列(一)---ndarray对象的属性与numpy的数据类型
  10. [转载]你是那个能和我同行一生的人吗?
  11. (ZT)关于IAP防止破解的几点
  12. 计算机安全模式启动时蓝屏,电脑如何进入安全模式修复蓝屏故障
  13. 网管世界 网管生活 网管总结
  14. Android聊天软件开发(基于网易云IM即时通讯)——注册账号(二)
  15. 对多元函数微分一些思考和总结
  16. 移动端开发rem实现屏幕适配及处理页面加载页面坍塌样式错乱网页闪烁问题
  17. ZBrush的用途是什么
  18. One_hot和Word2Vec两种词向量方法的原理及比较
  19. AP AUTOSAR 6——Execution Management
  20. [PMZL]第1卷-误入天庭-02

热门文章

  1. 网易云音乐评论爬虫:爬取全部热门歌曲及其对应的id号(附全部代码)
  2. docker Swarm简介 新旧版本操作不一样docker run --rm swarm create和docker swarm --init
  3. html 字符相同判断,javascript判断字符串是否相等
  4. Ubuntu全方位美化,定制教程
  5. scrapy框架爬取Boss直聘,数据存入mysql
  6. 出现高并发的几种问题
  7. 一瓶好酒和一个私家“酒窖”的结合——生活需要仪式感
  8. 10个优质的基于Node.js的CMS 内容管理平台
  9. 计算机英语写一封邮件给汤姆作文,英语仿写一封信 介绍自己
  10. 游戏主程的2018年终总结:从开发到上线,这些事很重要