如何用FFMpeg生成视频

前言FFMpeg读做“FF Mpeg”,“FF”指的是“Fast Forward”,而“Mpeg”指的是Moving Picture Experts Group(动态图像专家组) 。
根据官方介绍,FFMpeg是一个完整的、跨平台的音频和视频录制、转换和流媒体解决方案 。简单来说,只要涉及音视频开发,基本绕不开这个工具 。
一、快速入门FFMpeg快速入门的话,建议查看阮一峰老师的《FFmpeg 视频处理入门教程》,里面讲述了音视频处理的一些基本概念,比如FFMpeg支持的容器、编码格式以及编码器;还有就是讲述FFMpeg的常见用法,比如查看文件信息、转换编码格式、提取音频等 。
二、音视频基础知识我自己在使用FFMpeg的时候发现,想要把FFMpeg用得明白,一些基本的音视频基础知识的了解还是很有必要的,所以在这里做下总结 。
现在短视频那么火,相信大家也是常看,而一个视频的构成其实也不复杂,就是图像、音频、字幕的一个组合 。
对于图像,它有两个概念需要区分好,分别是图像格式和色彩空间 。图像格式就是图片压缩编码以及存储的方式,比如我们常见的JPEG和PNG 。色彩空间是颜色的数学描述方式,根据不同的表示方法分为不同的色彩模型,最常用的色彩模型有三类,RGB(用于计算机图形学),YUV(用于视频系统), CMYK(用于彩色印刷) 。(后面会经常看到YUV)
对于音频,也有两个概念比较重要,一个是采集到的原始音频数据(比如PCM),另一个是压缩后的音频数据,比如AAC,后面也会经常看到 。
对于字幕,常见的有三种格式,分别是srt、ssa和aas 。
srt字幕即文本格式字幕,它算是最简单的字幕了,因为它仅由时间和字幕内容构成,比如下面:
# 第一行是编号,表示第几个字幕# 第二行是时间范围,精确到毫秒# 第三话就是显示的文本内容000:00:00,000 --> 00:00:01,000假设张三携带10万美刀进行投资100:00:02,000 --> 00:00:03,000兑换成人民币后,银行就多了10万美刀的外汇复制代码ssa字幕是比srt字幕更先进的字幕文件格式,而与它比较类似的ass字幕其实就是ssa字幕的plus版本,ass字幕的实质是SSA v4.00+,是基于SSA 4.00+编码构建的 。下面是ass字幕的具体内容:
# 这是从上面的srt字幕转换得到的ass字幕# Script Info:包含脚本的头部和总体信息# V4+ Styles:包含了所有样式的定义# Events:包含了所有脚本的事件,有字幕、注释、图片等[Script Info]; Script generated by FFmpeg/Lavc58.91.100ScriptType: v4.00+PlayResX: 384PlayResY: 288ScaledBorderAndShadow: yes[V4+ Styles]Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, EncodingStyle: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0[Events]Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, TextDialogue: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,假设张三携带10万美刀进行投资Dialogue: 0,0:00:02.00,0:00:03.00,Default,,0,0,0,,兑换成人民币后,银行就多了10万美刀的外汇复制代码三、一个视频的构建我之所以要用FFMpeg,源于我想通过图片生成视频,并加上音频和字幕,从而构成一个完成的视频,所以下面我主要说说在构建时的一些心路历程(坑) 。
3.1 项目结构本次实践生成的音视频都会上传到Github,可以点击这里查看:
# 项目结构$ tree -l -L 1.├── add_audio# 添加音频├── add_caption # 添加字幕└── img_to_video # 图片转视频复制代码3.2 图片生成视频为了方便展示,我从网上随便找了一张图片:

如何用FFMpeg生成视频

文章插图
 
图片转视频的命令如下:
$ ffmpeg -r 25 -i img001.jpg -vcodec libx264 -pix_fmt yuv420p one_img_to_video.mp4...[libx264 @ 0x7faf5b809200] i8c dc,h,v,p: 65% 19%9%7%[libx264 @ 0x7faf5b809200] kb/s:8960.40复制代码下面是各个参数的逐个解析:
  • -r:rate,用于设定视频帧率 。视频帧率即每秒显示帧数,常见的有30FPS、25FPS或者24FPS 。本次设定为25FPS,即每秒有25张图片 。
  • -i:input,即输入源文件 。
  • -vcodec:video codec,即视频的编码格式,常见的有H.264,即libx264 。
  • -pix_fmt:pixel formats,即像素格式,yuv420p是上文提到的YUV中的一种 。
  • one_img_to_video.mp4:最后输出的文件名 。
生成之后的视频,可以看到时长非常短(0秒),这是因为帧率设定是25,但是只输入了一张图片,图片数不够,所以生成的视频时长非常短 。


推荐阅读