您当前的位置:首页 > 电脑百科 > 软件技术 > 音/视频编辑

如何用FFMpeg生成视频

时间:2022-02-11 10:45:11  来源:  作者:Java云海

前言

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字幕即文本格式字幕,它算是最简单的字幕了,因为它仅由时间和字幕内容构成,比如下面:

# 第一行是编号,表示第几个字幕
# 第二行是时间范围,精确到毫秒
# 第三话就是显示的文本内容

0
00:00:00,000 --> 00:00:01,000
假设张三携带10万美刀进行投资

1
00: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.100
ScriptType: v4.00+
PlayResX: 384
PlayResY: 288
ScaledBorderAndShadow: 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, Encoding
Style: 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, Text
Dialogue: 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,但是只输入了一张图片,图片数不够,所以生成的视频时长非常短。

解决办法有两种:一是降低帧率(不推荐),二是增加图片数量(推荐)。

我一开始是通过降低帧率来提高时长(我的需求是同一张图片要显示10秒左右),因为25FPS就是一秒25张图片,那如果设置为0.1FPS,等同于1张图片10秒,测试如下:

$ ffmpeg -r 0.1 -i img001.jpg -vcodec libx264 -pix_fmt yuv420p one_img_to_video_small_rate.mp4
复制代码

通过下图,可以看到延长时长的目的确实达到了,但是这种方式生成的MP4其实是有问题的,不仅剪辑软件无法支持(比如剪映),在添加音频、字幕的时候也非常奇怪(血的教训)。

如何用FFMpeg生成视频

 

第二种方式是增加图片数量,这也是我使用剪映之后发现的,因为与剪映拖动图片增加视频长度的原理是一致的:

如何用FFMpeg生成视频

 

批量增加图片可以随便写个脚本就可以得到,但是图片的数量需要计算一下,比如一个时长10秒,帧率25FPS的视频就需要 10 x 25 = 250张图片:

# 输入为多张图片时,可使用这种写法
# %03d 其实就是 001、002、003...100
$ cd img_to_video

$ ffmpeg -r 25 -i img/img%03d.jpg -vcodec libx264 -pix_fmt yuv420p multi_img_to_video.mp4
复制代码

这里可能有人会疑惑,为什么每次我都会带上 -pix_fmt yuv420p参数?这其实也是一个坑,因为如果不加这个参数,有些软件没办法识别生成的MP4文件,比如mac 的QuickTime Player。

原因可以从官方文档得到,因为我们生成视频的方式其实是通过图像序列(一系列的图片)的方式,对应的编码类型为image2,这也是为什么有时在一些文章上可以看到他们的命令比上述命令多了 -f image2参数(加不加都无所谓)。在这种编码下,默认的pix_fmt参数并不是yuv420p,而是通过第一张图片得到,而JPG图片用的都是RGB,所以最终生成的视频无法识别。

3.2 视频添加音频

通过上面的方式生成的视频是没有声音的,所以我们需要通过FFMpeg为其加上音频。

有时候我们得到的音频格式并不是MP3,而是WAV,这时我们可以通过下面的命令进行转换:

$ ffmpeg -i input.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3

-i: 上文也提到过,即我们的输入文件

-vn:禁用视频,确保没有视频被包括在内

-ar:设置音频采样频率。对于输出流,它默认设置为相应的输入流的频率。对于输入流,这个选项只对音频抓取设备和原始解复用器有意义,并被映射到相应的解复用器选项中。

-ac:设置音频通道的数量。这里为2是为了确保它是立体声(2个通道)。对于输出流,它默认设置为输入音频通道的数量。对于输入流,这个选项只对音频抓取设备和原始解复用器有意义,并被映射到相应的解复用器选项中。

-b:a:将音频比特率(audio bitrate)转换为精确的192kbit/秒
复制代码

上面的解释涉及到解复用这个术语,那什么是解复用呢?当我们打开一个多媒体文件之后,第一步就是解复用,称之为Demux。为什么需要这一步,这一步究竟是做什么的?我们知道在一个多媒体文件中,既包括音频也包括视频,而且音频和视频都是分开进行压缩的,因为音频和视频的压缩算法不一样,既然压缩算法不一样,那么肯定解码也不一样,所以需要对音频和视频分别进行解码。虽然音频和视频是分开进行压缩的,但是为了传输过程的方便,还是将压缩过的音频和视频捆绑在一起进行传输。所以我们解码的第一步就是将这些绑在一起的音频和视频流分开来,也就是传说中的**解复用。**简单来说,解复用这一步就是将音频流和视频流分开,方便后续解码。

转换之后就可以为视频添加音频了,这里使用的视频是上文生成的图片视频(注意添加音频也能用wav格式,只不过我习惯用mp3)

# 拷贝视频
$ cp img_to_video/multi_img_to_video.mp4 add_audio/input.mp4

# 添加音频有多种方式:
# 方式一:流拷贝(不推荐)
# 这种方式没有编解码的过程,只有解复用,所以速度很快,目前亲测不成功,不太建议
$ ffmpeg -i input.mp4 -i input.mp3 -codec copy audio_copy.mp4

# 方式二:手动选择特定流(不推荐,亲测无效)
$ ffmpeg -i input.mp4 -i input.mp3 -map 0:v -map 1:a -c copy audio_manually.mp4

# 方式三:重新编码(亲测有效)
$ ffmpeg -i input.mp4 -i input.mp3 -c:a aac -c:v libx264 audio_recode.mp4

# 有时候我们的音频长度大于视频长度,比如本次音频长度为20s,视频长度为10s,使用上面的命令会把视频长度拉长到20s
# 如果想要音频长度与视频长度保持一致,可加上 -shortest 参数
$ ffmpeg -i input.mp4 -i input.mp3 -c:a aac -c:v libx264  -shortest audio_recode_short.mp4
复制代码

3.3 视频添加字幕

添加完音频后,就可以添加字幕了,关于字幕转换工具,可以自己手写一个,也可以用现成的,比如下面这个:

TXT to SRT Converter

使用起来也非常方便,每一行就是一行字幕,最后设置好起始时间就可以了(不一定与实际朗读匹配):

如何用FFMpeg生成视频

 

添加srt字幕的命令如下:

# 拷贝之前生成好的视频
$ cp add_audio/audio_recode.mp4 add_caption/input.mp4

# 添加字幕
$ ffmpeg -i input.mp4 -vf subtitles=input.srt video_with_srt.mp4

# 有时候可能会遇到下面的报错:Too many packets buffered for output stream 0:1
# 该异常抛出的原因是有些视频数据有问题,导致视频处理过快,容器封装时队列溢出
# 可以通过增大容器封装队列大小来解决,比如设置最大封装队列的大小为1024
$ ffmpeg -i input.mp4 -vf subtitles=input.srt -max_muxing_queue_size 1024 video_with_srt.mp4 
复制代码

有时候我们需要自定义字幕的样式,或者字幕的位置,这时可以先把srt字幕转换为ass字幕,再做调整。如果你安装了FFMpeg,一行命令就能完成转换,如果没有安装,也可以用一些在线工具实现,比如字幕酱。

FFMpeg转换命令:

$ ffmpeg -i input.srt output.ass
复制代码

添加ass字幕命令:


$ ffmpeg -i input.mp4 -vf "ass=output.ass" video_with_ass.mp4
复制代码

最终效果如下:

如何用FFMpeg生成视频

 

如果想要控制字幕使用的文字、文字大小、以及显示位置等,则需要修改[V4+ Styles]里面的内容:

# 一共分为两行,第一行是字段名,第二行是字段值
# Fontname:字型
# Fontsize:字体大小
# MarginL:字幕距左边的距离,取值范围是0-PlayResX的数值
# MarginR:字幕距右边的距离,取值范围是0-PlayResX的数值
# MarginV:字幕高度,取值范围是0-PlayResY的数值
[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, Encoding
Style: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
复制代码

注:其他参数的说明可参考这篇文章

假设我要把字幕大小改为20、且字幕往上移动,则对应的改动如下:

[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, Encoding
Style: Default,Arial,20,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,50,0
复制代码

最后重新添加即可:

$ ffmpeg -i input.mp4 -vf "ass=new.ass" video_with_new_ass.mp4
复制代码

最终效果如下:

如何用FFMpeg生成视频

 

写在最后

以上就是如何用FFMpeg构建完成视频的全流程了,希望对大家有所帮助!



Tags:FFMpeg   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言FFMpeg读做“FF Mpeg”,“FF”指的是“Fast Forward”,而“Mpeg”指的是Moving Picture Experts Group(动态图像专家组)。根据官方介绍,FFMpeg是一个完整的、跨平台的音频和...【详细内容】
2022-02-11  Tags: FFMpeg  点击:(0)  评论:(0)  加入收藏
下面的一切都是在 root 模式下进行的,可以不再 root 模式下进行1. 安装linux的基础环境基础环境就是编译代码的基础库,Ubuntu联网安装软件很简单,一个语句即可搞定,这里列出语句...【详细内容】
2022-01-20  Tags: FFMpeg  点击:(27)  评论:(0)  加入收藏
首先开始的时候我们插入一张雷神大大的图帮助大家理解一下我们今天的操作究竟属于那一步。 从上图可以看出我们要做的,就是将像素层的 YUV 格式,编码出编码层的 h264数据。首...【详细内容】
2022-01-14  Tags: FFMpeg  点击:(36)  评论:(0)  加入收藏
FFmpeg的作用: FFmpeg是一个优秀的多媒体框架; FFmpeg可以运行在Linux,Mac,Windows等平台; FFmpeg可以解码,编码,转码,复用,解复用,过滤音视频数据。播放器基本架构:image.pngSDL视频渲...【详细内容】
2021-10-27  Tags: FFMpeg  点击:(38)  评论:(0)  加入收藏
ffmpeg 常用基本命令资料推荐【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发-学习视频教程-腾讯课堂1.分离视频音频流ffmpeg -i input_file -vcodec copy -an...【详细内容】
2021-10-15  Tags: FFMpeg  点击:(72)  评论:(0)  加入收藏
一、FFmpeg视频解码器1.视频解码知识1).纯净的视频解码流程压缩编码数据->像素数据。例如解码H.264,就是“H.264码流->YUV”。2).一般的视频解码流程视频码流一般存储在一定...【详细内容】
2021-05-19  Tags: FFMpeg  点击:(172)  评论:(0)  加入收藏
1.前言当我们在在看腾讯视频或者其他网页上的视频时,浏览器会先缓冲ts文件到你本地.如果你想把这些ts转成mp4文件保存在本地,可以使用ffmpeg进行格式转换。准备需要合成mp4而...【详细内容】
2021-04-25  Tags: FFMpeg  点击:(471)  评论:(0)  加入收藏
在实际工作中,通常需要ffmpeg作为工具来验证一个问题,比如播放一个视频,提取一个码流,转码视频,转封格式等,用的时候才发现忘记了相关命令,Google一番花老大的力气才找到自己需要的...【详细内容】
2020-09-27  Tags: FFMpeg  点击:(80)  评论:(0)  加入收藏
1.环境搭建和整体工程说明命令行输入:-i 3.flv -vcodec copy 2_audio.mp4 转码的CPU占有率。 需要在这个目录下,拷贝正确的SDL2.dll 转码过程: 转码成功后,MP4的大小要比3.fl...【详细内容】
2020-09-24  Tags: FFMpeg  点击:(139)  评论:(0)  加入收藏
1.框架分析 ffplay.c是FFmpeg源码⾃带的播放器,调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。例如哔哩哔哩著名开源项⽬ijkplayer也是基于ffplay.c进⾏⼆次开发。ffplay实...【详细内容】
2020-09-09  Tags: FFMpeg  点击:(113)  评论:(0)  加入收藏
▌简易百科推荐
前言FFMpeg读做“FF Mpeg”,“FF”指的是“Fast Forward”,而“Mpeg”指的是Moving Picture Experts Group(动态图像专家组)。根据官方介绍,FFMpeg是一个完整的、跨平台的音频和...【详细内容】
2022-02-11  Java云海    Tags:FFMpeg   点击:(0)  评论:(0)  加入收藏
目前短视频行业的快速兴起,越来越多的人开始从事短视频行业,同时也有许多人在为视频后期的配音而焦虑,自己的原声配音,要么不是音色不够好要么就是音色太单一,今天小编就教给大家...【详细内容】
2022-01-26  哆啦A梦的静香    Tags:视频配音   点击:(16)  评论:(0)  加入收藏
mp3文件太大怎么压缩变小?大家都知道mp3是一种常见的音频文件格式,我们平常的录音文件都是这种格式的,也是使用最广泛的音频格式。有时候mp3文件很大会给我们的使用造成很大的...【详细内容】
2022-01-18  西部理工男    Tags:mp3文件   点击:(19)  评论:(0)  加入收藏
首先开始的时候我们插入一张雷神大大的图帮助大家理解一下我们今天的操作究竟属于那一步。 从上图可以看出我们要做的,就是将像素层的 YUV 格式,编码出编码层的 h264数据。首...【详细内容】
2022-01-14  海哥科技宅    Tags:FFmpeg   点击:(36)  评论:(0)  加入收藏
剪映可以剪辑音频,具体操作方法如下:1、打开剪映后,点击“开始创作”。2、在“照片视频”或“素材库”中随便选择一个媒体文件,然后点击添加。建议选择图片,可省去步骤3和步骤4中...【详细内容】
2022-01-10  玩手机的张先生    Tags:剪映   点击:(96)  评论:(0)  加入收藏
m4a和mp3一样,都是一种音频格式,m4a是一种专属于苹果的音频格式,比如iphone手机的录音文件就是m4a格式的,对于苹果手机用户来说并不陌生。而mp3则是一种常见的通用的音频格式,大...【详细内容】
2022-01-10  优速办公软件    Tags:m4a   点击:(29)  评论:(0)  加入收藏
电脑如何mp4转mp3?mp4和mp3分别是常见的视频和音频文件。当我们从网上获取视频或音频时经常能够接触到它们。简单地从网上获取mp4视频和mp3音频,我们都会,但是用电脑如何将mp4...【详细内容】
2022-01-10  娱乐乐小女警    Tags:视频文件   点击:(57)  评论:(0)  加入收藏
很多人想在Windows11电脑上录制电脑上播放的声音或音乐,却不知道如何操作。Win11系统是微软推出的最新系统,很多人购买的电脑上都预装了正版Win11系统,小编购买的联想笔记本电...【详细内容】
2022-01-10  手机技术达人    Tags:录制   点击:(98)  评论:(0)  加入收藏
嗨喽,亲爱的小伙伴们,小编我又来啦!每每收到私信我都很想把我之前分享过的文章转发给这些需要的小伙伴。不过呢,重新换个角度去分享也挺好的,让更多的小伙伴看到小编的分享也不错...【详细内容】
2022-01-10  酷酷的西部牛仔    Tags:视频   点击:(27)  评论:(0)  加入收藏
目前市面上音频文件有各种类型, 虽然我们可能都熟悉 MP3,但 AAC、FLAC、OGG 或 WMA 呢? 为什么存在这么多音频标准? 有没有最好的音频格式? 哪些是重要的,哪些可以忽略?一旦您意识...【详细内容】
2022-01-07  ITBang    Tags:音频格式   点击:(46)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条