前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FFmpeg从入门到精通-云享读书会

FFmpeg从入门到精通-云享读书会

作者头像
DS小龙哥
发布2022-10-06 08:24:59
4.9K0
发布2022-10-06 08:24:59
举报

前言

FFmpeg是一款开源软件,用于生成处理多媒体数据的各类库和程序。FFmpeg可以转码、处理视频和图片(调整视频、图片大小,去噪等)、打包、传输及播放视频。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。

FFmpeg被称作是音视频领域的瑞士军刀,是音视频及相关领域是无人不晓,无人不知的项目, 只要了解多媒体音视频处理的人,都会感叹这个项目的强大。

FFmpeg项目由 Fabrice Bellard在2000年创立,到目前为止,经历了21年的演化。FFmpeg社区和其他多媒体项目互动频繁,这也是它成功的原因之一。在创立之初,有很多开发者同时活跃在Mplayer项目,到目前为止,FFmpeg项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠。2004年以后,FFmpeg社区基本由Michael Niedermayer领导。

在这近22年的风风雨雨中,FFmpeg一路走来也是经历过不少挫折,在2011年 FFmpeg 就因为核心成员意见不一导致分裂,差点最终导致整个项目消亡殆尽。最终的结果就是,项目创始人法布里斯贝拉选择了离开FFmpeg,但是随后他与其他一起出走的开发者创建另一知名开源编解码库项目Libav。 FFmpeg和 Libav ,就像南慕容和北乔峰一样,是当下所有主流播放器必备的编解码库,并且这些编解码库全部开源可免费使用无需额外付费。不过,虽然说是免费使用,但FFmpeg是基于LGPL/GPL开源的,这意味着如果某软件使用了FFmpeg的代码,那么这个软件涉及这些代码的部分,也必须开源,并且需要在使用其项目源代码和编解码库时注明来源。目前,FFmpeg不仅被大量免费软件使用,同时使用的,还有很多大型公司,例如:YouTube、iTunes、腾讯旗下产品、字节跳动旗下产品等。

当前文章内容来至 华为云 · 云享读书会 第13期 《FFmpeg从入门到精通》读书会直播视频的资料整理,《FFmpeg从入门到精通》的作者是一位典型的音视频技术爱好者,前后就职于广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解。

接下来会陆续按照几个章节由浅入深地介绍FFmpeg处理音视频的常用方法, 对音视频技术感兴趣的小伙伴能从中学到很多干货。

当前文章能学习的知识点:

(1)了解多媒体处理工具FFmpeg工具集

(2)了解音频文件的封装格式、编码格式

(3)了解视频文件的封装格式、编码格式

(4)掌握FFmpeg查看音视频媒体信息的方法

(5)掌握FFmpeg处理音视频文件的常用方法

一、多媒体处理工具 FFmpeg 工具集

(1)FFmpeg的发展

FFmpeg 是一个多媒体开源项目,项目地址:https://github.com/FFmpeg/FFmpeg

FFmpeg 最早是由法国天才程序员法布里斯·贝拉在 2000年时开发的,后来一直快速发展至今,当前最新的版本是 5.0。

目前,FFmpeg 已经被很多开源项目所采用,比如 ijkplayer、VLC、MPlayer、Blender、Google Chrome等。

(2)FFmpeg的组成

FFmpeg 工程内部根据功能划分了不同的模块,包括 AVFormat、AVCodec、AVFilter、AVDevice、AVUtil、swresample、swscale。

image-20220919230123846
image-20220919230123846

(3)FFmpeg的模块介绍

【1】AVFormat 是 FFmpeg 的封装模块,其中实现了目前多媒体领域中的绝大多数媒体 封装格式,包括封装和解封装,比如 MP4、FLV、MKV、TS 等文件封装格式,RTMP、 RTSP、HLS 等网络协议封装格式。另外,也支持自定义封装格式。

【2】AVCodec 是 FFmpeg 的编解码模块,其中实现了目前多媒体领域中的绝大多数媒体 编解码格式,包括编码和解码两大部分,比如 MPEG4、H264、H265 等视频格式,AAC、 MP3 等音频格式。另外,也支持自定义编解码格式。

【3】AVFilter 是 FFmpeg 的滤镜模块,其中实现了目前通用的音频、视频、字幕等滤 镜处理框架。

【4】AVDevice 是 FFmpeg 的设备管理模块,包括音频设备和视频设备。

【5】AVUtil 是 FFmpeg 的工具模块。

【6】swresample 是 FFmpeg 的音频转换模块,包括音频重采样、声道数调整等。

【7】swscale 是 FFmpeg 的视频图像转换模块,包括图像缩放、像素格式转换等。

FFmpeg开发库:

(4)FFmpeg的工具集

image-20220919233959107
image-20220919233959107

【1】ffmpeg 是 FFmpeg 工具集中的编解码工具。

【2】ffplay 是 FFmpeg 工具集中的播放器。

【3】ffprobe 是 FFmpeg 工具集中的多媒体分析工具。

(5)FFmpeg编译安装(linux)

【1】下载地址

【2】配置FFMPEG

二、视频文件的封装格式

FFmpeg 支持很多封装格式,包括 MP4、FLV、MKV、TS 等视频封装格式、MP3、AAC 等音频封装格式以及 RTMP、RTSP、HLS 等网络协议封装格式。 接下来,重点介绍 MP4 视频封装格式。

(1)MP4 封装格式

MP4 封装格式基本上可以认为是日常生活和工作中最常见的视频文件格式,主要是由于其广泛的适用性,不仅在PC端(windows、mac、linux)支持的非常好,而且在移动端(Android、iOS)也能流畅播放。

(2)MP4 格式标准

MP4 格式标准为 ISO-14496 Part 12 和 ISO-14496 Part 14,具体特征如下:

【1】MP4 文件由许多 Box 和 FullBox。

【2】FullBox 是 Box 的扩展,在 Header 中增加了8位version信息和24位的flags信息。

【3】每个 Box 由 Header 和 Data 两部分组成。

【4】Header 中包含了整个 Box 的长度大小(size)和类型(type)。

【5】Data 中包含了实际的数据,可以是纯数据,也可以是子 Box。当 Box 中的 Data 是一系列子Box 时,这个 Box 又被称为 Container(容器)。

image-20220920225417783
image-20220920225417783

(3)MP4 ftyp Box

ftyp Box,一般位于文件开始位置,其中包含了 MP4 视频文件的类型、版本、兼容协议等信息。

image-20220920225501393
image-20220920225501393

(4)MP4 moov容器

moov 容器中包含了 MP4 视频文件的媒体数据信息,内部又包含两个子容器:mvhd和trak,前者定义了文件头信息,后者定义了媒体文件中的track信息。

moov 容器一般默认会生成在 MP4 文件结尾,在线播放时需要加载完整个文件才能正常打开,为了能够快速打开视频,需要把 moov 容器放在 MP4 文件的前面。

image-20220920225535349
image-20220920225535349

(5)MP4 mdat Box

mdat Box,用来存放媒体文件的实际数据内容。

image-20220920225605322
image-20220920225605322

三、视频文件的编码格式

FFmpeg 支持很多视频编码格式,比如:MPEG4、H263、H264、H265、VP8、VP9 等。

接下来,重点介绍 H264 视频编码格式。

(1)H264的码率控制

【1】VBR:Variable BitRate,动态码率模式,其码率可以随着图像的复杂程度的不同 而变化,因此其编码效率比较高。

【2】CBR:Constant BitRate,恒定码率模式,由于码率恒定,有画面剧烈变化时,QP 参数会增大,图像质量会变差,当场景静止时,又浪费带宽。该模式的整体图像质量 不稳定。

【3】ABR:Average BitRate,平均码率模式,是 VBR 的一种衍生形式,在指定的文件 大小内,静态或者接近静态的画面部分使用相对较低的流量,复杂画面部分使用较高 的流量,可以视为是 VBR 和 CBR 的一种折衷方案。

(2)H264 的I帧类型

【1】一个GOP序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像,但I帧不一定都是IDR帧,只有GOP序列的第1个I帧是IDR帧。

【2】I帧,又叫帧内参考帧 ,保留一帧完整的画面。

【3】解码时仅用I帧的数据就可重构出完整的图像。

【4】I帧不需要参考其他画面而生成。

【5】I帧是P帧和B帧的参考帧。

【6】I帧不需要考虑运动矢量。

【7】I帧所占数据的信息量最大。

(3)H264 的B帧类型

【1】B帧,又叫双向参考帧,也就是B帧记录的是本帧与前后帧的差别,要解码B帧,不 仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加 取得最终的画面。

【2】B帧的压缩率最高,但是解码时CPU使用率会比较高。

【3】B帧是由前面的I或P帧和后面的P帧来进行预测的。

【4】B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量。

【5】B帧不是参考帧,不会造成解码错误的扩散。

(4)H264 的P帧类型

【1】P帧,又叫前向参考帧,表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解 码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面,P帧没有完整画面 数据,只有与前一帧的画面差异的数据。

【2】P帧是I帧后面相隔1~2帧的编码帧。

【3】P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)。

【4】P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。

【5】P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。

【6】P帧是参考帧,可能会造成解码错误的扩散。

【7】P帧的压缩比介于I帧和B帧之间。

(5)H264 帧参考关系

image-20220920223238630
image-20220920223238630

四、音频文件的封装格式和编码格式

(1)FFmpeg的音频封装格式

MP3 是我们在日常生活中最常见的音频格式之一,也是一种音频封装格式。

日常生活中,我们经常可以看到 *.mp3 的音频文件,就像 mp4、flv 的视频封装格式一样。

MP3 封装格式

使用如下命令查看 ffmpeg 支持的封装格式列表: ffmpeg -formats | grep mp3

image-20220920223427624
image-20220920223427624

使用如下命令播放一个 mp3 音乐文件:

普通模式: ffplay 少年.mp3

波形图模式:ffplay -showmode 1 少年.mp3

频谱图模式:ffplay -showmode 2 少年.mp3

image-20220921212208392
image-20220921212208392
image-20220921212303124
image-20220921212303124

(2)FFmpeg的音频编码格式

FFmpeg 支持很多编码格式,包括 MP3、AAC、AC3 等。

接下来,重点介绍 MP3 音频编码格式。

MP3 编码格式

MP3 也是一种音频编码格式。

和视频不同,视频编码格式,比如 H264,一般会封装 MP4 或者 FLV 这种封装格式中被使用。音频编码格MP3,则是封装在同名的 MP3 的封装格式中。二者容易混淆,注意区分。

MP3 编码格式

使用如下命令查看ffmpeg支持的编码格式列表:

image-20220920223905827
image-20220920223905827

MP3 文件结构

image-20220920223954979
image-20220920223954979

MP3 文件结构

image-20220920224017983
image-20220920224017983

五、FFmpeg 查看媒体信息和处理音视频文件的常用方法

(1)FFmpeg的工程化方案

音频文件和视频文件的转码处理一般称为多媒体处理,华为云也有相应的媒体处理服务——Media Processing Center,简称 MPC,是一种多媒体数据处理服务,基于华为云云计算服务构建,解决客户自建音视频处理能力不可避免的投入成本高昂、技术门槛高等问题,帮助客户专注于业务能力构建,快速交付上线。

【1】视频处理

image-20220920224329982
image-20220920224329982

【2】音频处理

image-20220920224354962
image-20220920224354962

(2)FFmpeg视频转码

采用 FFmpeg 对音视频处理,主要是转码、视频参数、音频参数三部分内容。

传统的转码程序工作原理如下图所示:

image-20220921215912379
image-20220921215912379

【1】音视频转码示例:

【2】最简单的方式转码

【3】任意格式转为MP4

(3)音视频合并

【1】视频拼接

这种方式需要保证所有的视频的格式、音频码率一样,不然无法正常合并。

【2】不同分辨率的源视频合成一个视频,设置画面的中心位置

【3】音频混合合成

【4】音频连接合成

【5】音频淡出效果

【6】使用 FFmpeg concat 过滤器重新编码(有损)

语法有点复杂,但是其实不难。这个方法可以合并不同编码器的视频片段,也可以作为其他方法失效的后备措施。

上面的命令合并了三种不同格式的文件,FFmpeg concat 过滤器会重新编码它们。注意这是有损压缩。

[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] 分别表示第一个输入文件的视频、音频、第二个输入文件的视频、音频、第三个输入文件的视频、音频。concat=n=3:v=1:a=1 表示有三个输入文件,输出一条视频流和一条音频流。[v] [a] 就是得到的视频流和音频流的名字,注意在 bash 等 shell 中需要用引号,防止通配符扩展。

【7】使用amix合并两种声音

(4)视频倒放

(5)视频转GIF

(6)给视频添加图片水印

【1】添加图片水印

image-20220921214306682
image-20220921214306682
image-20220921214318441
image-20220921214318441

【2】在视频左下角添加GIF动态水印

【3】水印显示时间变化

【4】水印位置变化

【5】GIF水印循环播放方式

【6】水印旋转

(7)使用ffprobe获取媒体信息

【1】输出媒体信息

【2】输出媒体信息

(8)采集桌面屏幕、摄像头保存为视频

【1】 列出当前电脑上音频设备、摄像头设备列表

【2】录制桌面全屏图像+音频

【3】录制摄像头+音频

【4】 采集桌面指定区域(无音频)

img
img

【5】采集桌面指定区域+音频

【6】案例

(9)视频音频替换

【1】去掉视频原声再添加新的音频

【2】保留视频原生添加新的音频

【3】替换原来影片的音讯

(10)给视频添加文字水印

【1】在图片的左上角(横坐标10.纵坐标100)添加水印:

image-20220921215457628
image-20220921215457628

【2】常见案例

(11)视频剪切

【1】案例1

【2】案例2

【3】案例3

(12)获取flv视频格式的时长

flv格式的视频不能像其他视频一样直接通过ffprobe输出的json获取,可以通过它的命令行输出截取时间段转换得到时间。

输出结果:

(13)视频实现各种特效

(14)转为关键帧(实现精确剪切)

平时剪辑视频,可能有些视频裁剪后的效果,如期望一致,00秒开始,30秒结束,总共30秒的视频,但是有些视频裁剪后你会发现可能开始和结束都不是很准确,有可能是从00秒开始,33秒结束。这是为什么呢? 因为这些视频里30秒处地方刚好不是关键帧,而ffmpeg会在你输入的时间点附近调整到最接近的关键帧处,然后做接下来的事情。 如果你不懂什么是关键帧,没关系,这也不影响你使用这个命令。 如果你的项目要求能够接受几秒的误差,那么这个命令完全就可以满足你的需要,接下来的内容你也没有必要往下看了。 如果你的项目里要求很严格,一定要到确定的时间。那么就要用另外一种方式。 上面的造成那样的原因是所选的时间不是关键帧,那如果我们将输入的视频先转换成所有的帧都为关键帧的视频,其实就是将所有的帧的编码方式转为帧内编码

剪出视频前6秒

(15)从视频中提取音频文件

(16)调整音频音量

这是改变音量的命令参数,在合成音频后,可能就是原视频声音很大,但是特效声音小,导致听起来忽大忽小,这种情况下可以统一调整一下音量。

(17)给视频添加ASS字幕文件

(18)视频中加入动画

【1】在视频第6秒添加动画

命令解释: 给r001_2视频加入动图,x,y 代表坐标,eof_action表示动图结束后的动作,0代表重复前一帧,1代表停止所有流,2代表保留主图层。

(19)给视频添加跑马灯效果(滚动字幕)

【1】从左往右滚

【2】从右往左滚

【3】从右往左滚,单次滚动时长10秒,间隔30秒滚一次

(20)FFMPEG 使用GPU加速转码处理视频

【1】软件硬件编码区别

视频转码时如果遇见视频比较大、时长很长的时候,转码压制需要等待很久且及占用cpu,所以就在想有没有什么办法可以加速转码进度呢 ,故本篇文章记录FFMPEG如何调用显卡对转换编码格式或者压制进行加速。

软硬编解码的区分: 软编码:使用CPU进行编码 硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等

软硬编解码的区别: 软编码:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。 硬编码:性能高,低码率下通常质量低于软编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。

【2】查看支持的硬件加速方式

以上输出代表系统所支持的硬件加速方式,后续会用到。

硬编码后缀解释

qsv:intel显卡的快速视频同步技术(quick sync video)

nvenc:nvidia显卡的硬件视频编码器(nvidia hardware video encoder)

cuvid:nvdec的旧称,只有解码端。

cuda: 同上

amf:amd显卡的amf硬件编码器(amd hardware encoder)

基本上所有的Intel 电脑都支持qsv方式。

【3】硬件加速命令

常用命令参数解释 -hwaccel cuvid:使用cuvid进行硬件加速 -c:v h264_cuvid:使用h264_cuvid进行解码 -c:v h264_nvenc:使用h264_nvenc进行编码(nvidia硬件加速x265) -b:v 2000k:比特率,值越大约清晰。 -s 1920x1080:分辨率 -b:v 3500K :视频平均比特率为 3500K -bufsize 6000K:缓存区大小 6000K,建议设定为 当前码率帧率5,也许这里的2pass是针对缓冲区的,缓存未来5s -maxrate 5000K:最大码率为 5000K,每帧的最高码率不超过这个数值 -preset slow:预设方案是 slow,slow已经是最好的选项了 -pix_fmt p010le:输出的像素格式是 p010le 也就10bit,只有新的硬件支持,例如:970m不支持,1070可以支持

【4】使用CUDA与CUVID解码

【5】使用qsv解码

【6】案例

(21)ffmpeg获取视频截图

使用ffmpeg可以非常方便的生成视频截图,ffmpeg 通过指定 -vcodec 参数为 mjpeg,或者指定 -f 参数为 mjpeg时,可以输出 jpg截图,指定 -vcodec参数为png,或者指定输出文件扩展名为png,可输出png截图。如果参数指定不当,会导致ffmpeg处理速度非常缓慢。

(22)视频尺寸不变,按比例缩放(画黑边)

(23)视频与图片之间互转

(24)ffmpeg推流到rtmp服务器

(25)ffmpeg推流到rtsp服务器

(1)推流视频文件到RTSP服务器

(2)将视频文件循环推到RTSP服务器

(3)录制电脑屏幕并推流到RTSP服务器

(4)推流摄像头视频到RTSP服务器(windows)

六、总结

当前文章里先介绍FFmpeg工具集、以MP4、MP3为例介绍音视频文件的封装格式、编码格式,最后再列出了多个ffmpeg命令行处理音视频案例,方便大家快速了解ffmpeg的常用方法。但是ffmpeg的功能并不局限与此,当前文章只是重点介绍ffmpeg命令行处理方式,如果需要在项目里引用ffmpeg完成一些特定项目的开发。比如:视频播放器、音视频剪辑软件,特效制作软件等等,还需要对ffmpeg的源码进行深度了解,熟悉各个API的功能与调用方法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、多媒体处理工具 FFmpeg 工具集
    • (1)FFmpeg的发展
      • (2)FFmpeg的组成
        • (3)FFmpeg的模块介绍
          • (4)FFmpeg的工具集
            • (5)FFmpeg编译安装(linux)
            • 二、视频文件的封装格式
              • (1)MP4 封装格式
                • (2)MP4 格式标准
                  • (3)MP4 ftyp Box
                    • (4)MP4 moov容器
                      • (5)MP4 mdat Box
                      • 三、视频文件的编码格式
                        • (1)H264的码率控制
                          • (2)H264 的I帧类型
                            • (3)H264 的B帧类型
                              • (4)H264 的P帧类型
                                • (5)H264 帧参考关系
                                • 四、音频文件的封装格式和编码格式
                                  • (1)FFmpeg的音频封装格式
                                    • (2)FFmpeg的音频编码格式
                                    • 五、FFmpeg 查看媒体信息和处理音视频文件的常用方法
                                      • (1)FFmpeg的工程化方案
                                        • (2)FFmpeg视频转码
                                          • (3)音视频合并
                                            • (4)视频倒放
                                              • (5)视频转GIF
                                                • (6)给视频添加图片水印
                                                  • (7)使用ffprobe获取媒体信息
                                                    • (8)采集桌面屏幕、摄像头保存为视频
                                                      • (9)视频音频替换
                                                        • (10)给视频添加文字水印
                                                          • (11)视频剪切
                                                            • (12)获取flv视频格式的时长
                                                              • (13)视频实现各种特效
                                                                • (14)转为关键帧(实现精确剪切)
                                                                  • (15)从视频中提取音频文件
                                                                    • (16)调整音频音量
                                                                      • (17)给视频添加ASS字幕文件
                                                                        • (18)视频中加入动画
                                                                          • (19)给视频添加跑马灯效果(滚动字幕)
                                                                            • (20)FFMPEG 使用GPU加速转码处理视频
                                                                              • (21)ffmpeg获取视频截图
                                                                                • (22)视频尺寸不变,按比例缩放(画黑边)
                                                                                  • (23)视频与图片之间互转
                                                                                    • (24)ffmpeg推流到rtmp服务器
                                                                                      • (25)ffmpeg推流到rtsp服务器
                                                                                      • 六、总结
                                                                                      相关产品与服务
                                                                                      图像处理
                                                                                      图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
                                                                                      领券
                                                                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档