FFmpeg使用说明
基本概念
封装格式 编码格式 协议
- 封装格式:MP4
- 编码格式:H.264
- 协议:RTMP
音/视频流
在音视频领域,我们把一路音/视频称为一路流。如我们小时候经常使用VCD看港片,在里边可以选择粤语或国语声音,其实就是CD视频文件中存放了两路音频流,用户可以选择其中一路进行播放。
容器
我们一般把 MP4、 FLV、MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。
channel
channel是音频中的概念,称之为声道。在一路音频流中,可以有单声道,双声道或立体声。
视频解码
视频解码是将视频压缩编码后的数据流(例如 H.264、H.265 等)解码成原始的像素数据(通常是 YUV 格式),以便于显示或进一步处理的过程。在视频编码中,为了减小文件大小和提高传输效率,视频数据经过压缩编码处理,即将原始的视频数据压缩成较小的码流。而视频解码则是将这些压缩后的数据流还原成原始的视频像素数据,以便于播放或后续处理。
硬解码:
硬解码是利用专用的硬件解码器(通常是 GPU)来解码音视频流。硬解码器通常集成在显卡或其他专用的硬件设备中,能够高效地处理音视频解码任务。硬解码器通常支持多种音视频编解码器,并能够通过硬件加速来实现高效的解码性能。由于硬解码利用专用的硬件资源,因此能够在低功耗的情况下实现高效的解码,适用于移动设备、嵌入式系统和高性能计算环境等场景。
软解码:
软解码是利用通用的处理器(如 CPU)来解码音视频流。软解码器是通过软件实现的音视频解码算法,不依赖于专用的硬件设备。软解码器通常运行在通用的计算机系统上,利用 CPU 的计算能力来进行音视频解码。软解码虽然不具备硬解码那样的硬件加速能力,但能够在普通的计算机系统上运行,并且通常具有更好的兼容性和灵活性。软解码适用于各种计算环境,但在解码大尺寸、高码率的高清视频时可能会受到性能限制。
H.265 相比于 H.264 具有更高的压缩效率和更高的视频质量,但也需要更多的计算资源来进行编码。因此,在选择编码标准时,需要根据具体的应用场景和需求权衡各种因素。
DTS与PTS
DTS(Decoding Time Stamp)和 PTS(Presentation Time Stamp)是用于管理音视频流中时间信息的两种时间戳。
DTS(解码时间戳):
- DTS 表示数据在解码器中解码的时间点。它指示了数据在解码器中被解码的时间,即解码器何时开始处理数据。
- 对于视频流,DTS 表示视频帧被解码的时间点。
- 对于音频流,DTS 表示音频样本被解码的时间点。
PTS(显示时间戳):
- PTS 表示数据在播放器中显示的时间点。它指示了数据在播放器中何时被呈现给用户。
- 对于视频流,PTS 表示视频帧被显示的时间点。
- 对于音频流,PTS 表示音频样本被播放的时间点。
通常情况下,音视频数据在传输过程中可能会发生延迟或者重排列,DTS 和 PTS 用于确保数据能够在正确的时间点被解码和显示,以保证音视频同步以及顺畅播放。PTS 必须始终晚于或等于 DTS,以确保数据按正确的顺序呈现。
常见分辨率
38402160 (4K)
25601440 (2K)
19201080 (1080P 高清 200万像素)
1280720 (720P)
640*360 (360P)
除了1080P还有1080I
这里的P和I分别表示逐行扫描与隔行扫描
电视一般用I 网络视频,视频文件用P
dpi
每英寸像素
色彩空间模型
记录像素点色彩数据的方式
有RGB,YUV420,YUV422,YUV444,HSV,CMYK
网络视频一般使用YUV420
虽然颜色有所失真,但是数据量少
帧率
一秒的视频帧数(FPS)
网络视频一般为25FPS、30FPS
过高的帧率在感官上不会有所提升,反而影响性能
码率
- 一秒的数据量大小,单位Mbps
- 码率的设置是为了限制数据量过大,防止客户端带宽不足而产生卡顿
- 编码器会根据最大码率对视频进行有损压缩
GOP
GOP一般是H.264,H.265这些编码格式才有的概念
GOP(Group of Pictures)是视频编码中的一个重要概念,它定义了一组连续的视频帧,这些帧之间存在特定的时间关系,用于视频压缩编码和解码。
一个 GOP 包含以下类型的帧:
I帧(Intra-coded Frame):
I帧是一个关键帧,它是完整的帧,不依赖于其他帧进行解码。在编码器中,I帧通过对整个帧进行压缩编码,以保留最大的图像信息,从而提供了视频的基础图像。解码器可以利用I帧进行随机访问和解码。
P帧(Predictive-coded Frame):
P帧是通过对前向预测(从前面的I帧或P帧中预测)进行压缩编码得到的。它只包含当前帧和之前帧之间的差异数据,而不包含整个图像数据。P帧可以通过参考之前的I帧或P帧来解码。
B帧(Bidirectional-coded Frame):
B帧是通过对前向和后向预测(从前面的I帧或P帧以及后面的P帧中预测)进行压缩编码得到的。它包含当前帧和前后帧之间的差异数据,能够进一步提高视频的压缩比和质量。B帧需要参考前后的I帧或P帧来解码。
由于需要根据后向的帧进行推理,所以在
直播流等场景下,是不产生B帧的
,使直播流畅。
GOP 的结构通常如下所示:
I P P P B B P P P B B P P ...
其中,每个GOP以一个I帧开始,后面跟随一系列的P帧和B帧。GOP的长度(即包含的帧数)可以根据具体的编码设置进行调整,常见的GOP长度为 15、30、60 等。较长的GOP长度可以提高压缩效率,但会增加视频的延迟和解码复杂度;而较短的GOP长度可以提高视频的抗干扰能力和随机访问性能,但会降低压缩效率。因此,在实际应用中,需要根据视频的特性和需求来选择合适的GOP长度。
在线播放场景
- 一般不必关心GOP
- 为了防止未加载完跳转卡顿时间长等问题–>
因为两个I帧间隔过长
- 可以将GOP设置为帧率的4-5倍
直播场景
- 流媒体服务器设置缓存I帧
- GOP设置为帧率的1-2倍
- 禁止生成B帧
编码格式
具体的编码过程由编码格式决定
每个编码格式对应不同的压缩/解压缩算法
每个编码格式对应不同的编码器/解码器
客户端没有对应编码格式的解码器,是播不出视频的
只有对视频文件大小产生影响的参数才会作用与
编码阶段
,如码率,最大码率等,限制文件的大小,可能会发生有损压缩分辨率,帧率等参数是由
转码程序
完成的,编码器不支持这些修改
采样
- 当前一刻的声音样本
- 真实声音虽然是连续的,但是在计算机中,声音是离散且均匀的声音样本
位深度
音频的位深度是指用于表示每个采样值的比特数
。它决定了每个采样值可以表示的幅度范围,也影响了音频的动态范围和信噪比。
常见的位深度包括 8 位、16 位、24 位和 32 位等。较低的位深度会限制音频信号的动态范围,可能导致信号的失真和噪声的增加,特别是在低音量或者动态范围较大的场景下。相反,较高的位深度可以提供更广阔的动态范围和更低的噪声水平,因此产生更高质量的音频。
一般来说,16 位的位深度已经能够满足大多数音频应用的要求,包括 CD 音质和广播。24 位的位深度被认为是高保真音频的标准,它提供了更高的动态范围和更低的噪声水平,因此在专业录音和音乐制作中被广泛使用。32 位的位深度通常用于一些特殊需求,如音频处理中的临时计算过程,但在存储和传输过程中会转换为较低的位深度。
采样率
采样率(也称为采样频率)是指在一段时间内对模拟信号进行采样的频率,通常用赫兹(Hz)来表示。在数字音频处理中,采样率决定了每秒钟采集的采样数,它是一个非常重要的参数,直接影响到数字音频的质量和精度。
常见的音频采样率包括:
- 8 kHz:音频通话或监控录音。
- 22.05 kHz、24 kHz:FM调频广播。
- 44.1 kHz:这是最常用的音频采样率之一,用于 CD 音质。在音频 CD 中,每秒钟采集 44100 个样本。
- 48 kHz:这是另一个常见的音频采样率,用于广播、电影和多媒体制作等领域。
- 96 kHz、192 kHz:这些是高保真音频的采样率,用于专业音频录制和制作,它们提供了更高的音频质量和更广阔的频率范围。
较高的采样率可以提供更高的音频质量和更广泛的频率响应范围,因为它们能够更准确地捕捉音频信号的细节。然而,高采样率也会导致更大的数据量和更高的处理需求。
选择合适的采样率取决于具体的应用需求。对于一般的音频播放和日常录制,通常使用标准的采样率(如 44.1 kHz 或 48 kHz)即可满足需求。而在专业音频制作和高保真音频领域,可能会选择更高的采样率以获得更高的音频质量。
音频帧
将一小段音频采样数据打包在一起
具体时间跨度由编码格式决定
音频码率
一般网络音频直播,音频文件,码率在128Kbps即可
常用音视频编码标准
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
HEVC(H.265) | MPEG/ITU-T | 2013 | 新王 |
H.264 | MPEG/ITU-T | 2003 | 各个领域 |
MPEG4 | MPEG | 2001 | 不温不火 |
MPEG2 | MPEG | 1994 | 数字电视 |
VP9 | 2013 | 不温不火 | |
VP8 | 2008 | 不普及 | |
VC-1 | Microsoft Inc. | 2006 | 微软平台 |
名称 | 推出机构 | 推出时间 | 目前使用领域 | 损失 |
---|---|---|---|---|
AAC | MPEG | 1997 | 各个领域(新) | 有损 |
MP3 | MPEG | 1993 | 各个领域(旧) | 有损 |
FLAC | Josh Coalson | 2001 | 数字音乐市场 | 无损 |
WAV | Microsoft 和 IBM | 1991 | 音频处理和专业音乐制作领域 | 无损 |
常用协议与编码汇总
见pdf
OpenGL
OpenGL(Open Graphics Library)是一种用于渲染 2D 和 3D 矢量图形的跨平台图形 API(应用程序编程接口)。它允许开发人员通过编程方式创建高性能的图形应用程序,如视频游戏、模拟器、CAD 软件等。
OpenGL 由一个庞大的函数库组成,开发人员可以使用这些函数来执行各种图形操作,包括顶点操作、纹理映射、光照、投影等。它提供了一系列功能,使开发人员能够利用计算机的图形硬件来加速图形处理。OpenGL 是一种底层的图形 API,它提供了对图形硬件的直接访问,因此可以在不同的操作系统和硬件平台上实现高性能的图形渲染。
由于其跨平台特性和高性能,OpenGL 在计算机图形领域得到了广泛的应用。它被用于开发各种类型的图形应用程序,包括游戏、CAD 软件、虚拟现实应用程序、科学可视化工具等。OpenGL 是一个开放标准,由 Khronos Group 维护和推动发展,因此在不同的操作系统和硬件平台上都有相应的实现版本。
OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和图像处理库,提供了丰富的函数和工具,用于处理图像和视频数据。它由一系列 C++、Python、Java 等语言的函数库和模块组成,可以在各种平台上运行,包括 Windows、Linux、macOS 等。
OpenCV 提供了丰富的图像处理和计算机视觉功能,包括但不限于:
- 图像读取和保存:支持读取和保存多种格式的图像文件,如 JPEG、PNG、BMP 等。
- 图像处理:包括图像变换、颜色空间转换、滤波、边缘检测、形态学操作等。
- 特征检测和描述:提供了多种特征检测和描述算法,如 Harris 角点检测、SIFT、SURF、ORB 等。
- 目标检测和跟踪:包括 Haar 特征、HOG 特征、卷积神经网络(CNN)等目标检测算法。
- 视频分析:提供了视频读取、视频流处理、光流估计、运动检测等功能。
- 机器学习:提供了一些基本的机器学习算法和工具,如支持向量机(SVM)、K近邻(KNN)等。
OpenCV 是一个非常强大和广泛应用的图像处理库,被广泛应用于计算机视觉、图像处理、机器人、自动驾驶等领域。它被许多研究人员、工程师和开发者使用,并在学术界和工业界都有着广泛的影响。
直播流常用协议
RTMP、HTTP-FLV
- RTMP:
- 一般用于直播源推流,直播系统内直播流数据传递。
- 浏览器摒弃了Flash播放器,且据说高并发下rtmp会有问题,所以不用于拉流。
- 建立在TCP之上。
- 延迟低:1-3s。
- 变种RTMPT、RTMPS等。
- HTTP-FLV:一般用于客户端直播流观看。
- 网页需要引入flv.js才可播放该类型流。
- 延迟比RTMP略高。
- 二者都是在FLV封装格式基础上的。
- 现在比较流行的方案是,直播源推流是RTMP协议,直播拉流观看是HTTP-FLV协议。
- RTMP:
HLS(HTTP Live Streaming)
HLS协议一般只用作拉流观看,但是从严格意义上讲,HLS协议并不是流式协议。
它工作原理很简单,就是通过HTTP协议下载静态文件。
不同的是,HLS协议的文件由两部分组成,一是多个只有几秒长度的.ts碎片视频文件,另一个是记录这些视频文件地址的.m3u8索引文件,且这些静态文件都是直接写入磁盘的。
更具体的说,HLS观看地址是以http://开头、.m3u8结尾的,实际上这个地址就是索引文件的地址,客户端获取到索引文件后,就可以下载对应的碎片视频文件并开始播放了。
由于HLS协议实际上是通过HTTP协议请求文件的,且HLS相关文件是直接写入磁盘的,所以并不需要特殊的流媒体服务软件,使用Nginx等HTTP服务就可以了。
点播的场景下,也就是普通网络视频观看的场景下。.m3u8索引文件会记录所有的碎片视频文件地址,HLS在点播的场景下,优势是更加明显的。HLS协议的点播视频,会比.mp4、.flv的视频更快地播放出来,且在加载中跳转视频也会更加顺滑。
HLS协议在直播的场景下是没什么优势的。虽然HLS协议的直播流也可以适配很多播放场景,但是由于需要生成静态文件,直播延迟很大,大概在5-30秒左右,使用直播CDN的话,由于边缘节点同步等问题,直播延迟甚至可能会达到1分钟左右。
当然HLS协议也有一定的优势,在直播时移,也就是直播转点播,或者录播,也就是点播转直播的场景, 理论上只需要修改索引文件就可以了。
WebRTC
WebRTC协议其实并不是为了直播场景而设计的,WebRTC是一种点对点的视频/语音通话协议。
由于WebRTC是基于UDP的,建立通信后,会不断以流式发送数据,所以延迟会比RTMP还要低。
在一些交互性较高的直播场景,如直播带货等场景,会使用WebRTC作为推流和观看协议 WebRTC的延迟理论上可以达到1秒内。
RTSP
RTSP一般不用作直播场景,RTSP一般用作摄像头、监控等硬件设备的实时视频流观看与推送上。
尽管RTSP协议也支持推流/拉流,且支持TCP、UDP切换以及其他诸多优点。但是泛用性不足,特别是现在的浏览器都不支持RTSP的播放。
点播封装格式
MP4:适合在线播放视频不是主营业务的网站系统
FLV:适合短视频,小文件偏多的网站系统
HLS:适合长视频,大文件偏多的网站系统
音频重采样
音频重采样是指将音频信号从一个采样率转换为另一个采样率的过程。采样率是指每秒对音频信号进行采样的次数,通常以赫兹(Hz)为单位。音频重采样可能涉及改变采样率、通道数、位深度等参数。
音频重采样可能需要的几种情况包括:
播放器与音频设备之间的不匹配:音频设备通常有其支持的固定采样率,如果要播放的音频数据的采样率与设备不匹配,就需要对音频数据进行重采样以适应设备的要求。
音频数据源与目标之间的不匹配:从不同来源获取的音频数据可能具有不同的采样率,例如,网络音频流的采样率可能与本地音频设备的采样率不同,因此需要对音频数据进行重采样以使其匹配。
音频处理过程中的采样率变化:在音频处理中,可能需要对音频数据进行采样率变换,以进行滤波、混音等处理,或者将音频与视频进行同步。
音频合成:将多个来源的音频数据合成为一个音频流时,可能需要对其中一个或多个音频流进行重采样,以使其具有相同的采样率和其他参数。
重采样的过程通常涉及插值
、抽取
或过滤
等技术,以确保在转换过程中尽量减少失真和伪像。总的来说,音频重采样是一个常见的音频处理过程,可以帮助解决音频数据之间的不匹配问题,保证音频数据的质量和一致性。
源码解析
ffplay播放器流程
主要模块
- libavcodec : 编/解码
- libavdevice : 设备视频文件的封装/解封装
- libavfilter : 帧级操作(如添加滤镜)
- libavformat : 文件 I/O 和 封装/解封装
- libavutil : 通用工具集合
- libpostproc : 预处理
- libswresample : 音频重采样、格式处理、混音等
- libswscale : 色彩处理和缩放
命令
简介
我们按使用目的可以将 FFMPEG 命令分成以下几类:
基本信息查询命令
录制
分解/复用
处理原始数据
滤镜
切割与合并
图/视互转
直播相关
除了 FFMPEG 的基本信息查询命令外,其它命令都按下图所示的流程处理音视频。
(demuxer)打开输入文件,解封装,从容器格式中分离出音频、视频:
使用 FFmpeg 提供的 API 或命令行工具,打开要处理的输入文件。输入文件可以是音频文件、视频文件或者其他多媒体格式。
(decode)解码音视频数据:
从输入文件中读取音视频数据,并进行解码。对于音频数据,通常使用音频解码器进行解码,得到原始的音频样本数据。对于视频数据,使用视频解码器进行解码,得到原始的视频帧数据。
(encode)进行处理并编码处理后的音视频数据:
对音频数据和视频数据进行需要的处理,例如音频处理、视频处理、滤镜处理等。可以根据需要应用各种效果、转码、裁剪、缩放等操作。
将处理后的音频数据和视频数据进行编码。对音频数据使用音频编码器进行编码,得到编码后的音频数据。对视频数据使用视频编码器进行编码,得到编码后的视频数据。
(muxer)混流,封装编码后的音视频数据:
将编码后的音频数据和视频数据封装到容器格式中,生成最终的输出文件。可以选择不同的容器格式,如 MP4、AVI、FLV、MKV 等。
常用参数
- 输入/输出文件
- -i:指定输入文件。
- 输出文件:输出文件的格式由其扩展名确定。
- 视频相关参数
- -c:v / -codec:v:指定视频编解码器。
- -b:v:设置视频比特率。
- -s:设置视频分辨率(例如,-s 1920x1080)。
- -r:设置帧率(例如,-r 30 表示每秒 30 帧)。
- -vf:应用视频过滤器(例如,-vf “scale=1280:720” 用于缩放视频)。
- -an:删除音频流。
- -t:设置持续时间,适用于裁剪视频。
- 音频相关参数
- -c:a / -codec:a:指定音频编解码器。
- -b:a:设置音频比特率。
- -ac:设置音频通道数(例如,-ac 2 表示立体声)。
- -ar:设置音频采样率(例如,-ar 44100 表示 44.1 kHz)。
- -af:应用音频过滤器(例如,-af “volume=2” 用于增大音量)。
- 转码和格式转换
- -f:指定输出文件格式(例如,-f mp4)。
- -map:用于选择和重排流(stream),适合复杂的多流文件。
- -copy:用于直接复制编码流,不进行转码。
- 视频处理
- -ss:指定开始时间,用于剪切视频(例如,-ss 00:01:00 表示从 1 分钟开始)。
- -to:指定结束时间,用于剪切视频。
- -filter_complex:应用复杂的过滤器链,用于高级视频处理。
- 其他常用参数
- -y:在输出文件存在时强制覆盖。
- -n:在输出文件存在时不覆盖。
- -v:设置输出的详细程度(例如,-v quiet 表示静默模式)。
- -hide_banner:隐藏 FFmpeg 启动时的横幅信息。
- -threads:设置使用的线程数,以加速处理。
- -benchmark:输出处理时间,用于性能分析。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1430797759@qq.com