文章目录
- 一、FFmpeg 中的音视频相关术语
- 1、容器
- 2、媒体流
- 3、数据帧
- 4、数据包
- 5、编解码器
- 6、复用器
- 7、解复用器
一、FFmpeg 中的音视频相关术语
1、容器
FFmpeg 中的 " 容器 " 概念 , 指的是 特定格式的 多媒体文件 ;
如 : 一个 mp4 格式的文件 , 就是一个 多媒体 容器 , 其中包含了 视频流 / 音频流 / 字幕流 等 媒体流 ;
除了 音视频 数据 外 , 容器 中 还可以包括 其他信息 , 如 : 元数据 , 章节信息 , 封面图像 等 ;
常见的 " 容器 " 格式 :
- AVI ( Audio Video Interleave ) : 支持多个音频和视频流 , 适合视频编辑
- MP4 ( MPEG-4 Part 14 ) : 支持 H.264、AAC 等编码 , 压缩效率高 , 兼容性好 ;
- MKV ( Matroska Video ) : 可容纳无限数量的视频、音频、字幕流 , 适合存储高清内容 ;
- MOV ( QuickTime Movie ) : 支持高质量视频和多种编码 , 广泛应用于专业视频制作 , 多用于苹果设备 ;
- WEBM : 开源,适合在线流媒体传输。
- FLV ( Flash Video ) : 适合小文件和低延迟的流媒体 ,但逐渐被淘汰。
2、媒体流
FFmpeg 中的 " 媒体流 " 是 时间轴 上的 一段 连续数据
- 视频流 就是 一段时间内的 连续 视频数据 ,
- 音频流 就是 一段时间内的 连续 音频数据 ,
- 字幕流 就是 一段时间内的 连续 字幕数据 ,
媒体流 数据 可以是压缩的 , 也可以是非压缩的 ;
视频流 和 音频流 一般都会进行压缩 , 视频流使用 H.264 压缩格式 , 音频流使用 AAC 压缩格式 ;
视频流 和 音频流 的原始数据分别是 YUV 数据 和 PCM 数据 , 一般很少使用原始码流 , 占用空间极大 ,
- WAV 音频格式容器 使用的是 PCM 数据音频流 , 只有这一种情况 , 使用 原始码流 ;
- 但是 几乎没有任何容器直接存放 YUV 格式的原始码流数据 ;
直播场景码流格式分析 :
- 推流 : 直播的时候 , 先把 视频压缩成 H.264 格式 , 音频压缩成 AAC 格式 , 然后封装成 数据包上传到服务器 ,
- 拉流 : 观看直播时 , 下载压缩的数据包 , 先将音视频数据包解码成 YUV 和 PCM 原始数据 , 再进行播放 ;
使用 MediaInfo 工具打开一个 mp4 格式的容器 , 可以看到该 mp4 容器中有 2 个媒体流 , 分别是 AVC 格式的视频流 和 AAC 格式的音频流 ;
- AVC 格式视频 , 全称为 Advanced Video Coding ( 高级视频编码 ) , 就是 H.264 编码 ;
3、数据帧
数据帧 是 音视频 媒体流 的 最小单位 , 由 未压缩 的 原始数据 构成 , 代表了某一时刻的 音频 或 视频 的样本或图像 ,
- 视频帧是解码后的 YUV 格式 单幅图像 ,
- 音频帧是解码后的 PCM 原始音频样本 ;
FFmpeg 中 , 使用 AVFrame 结构体封装数据帧
FFmpeg 中的 编解码器 是 以 数据帧 为 为最小单位进行工作的 , 编解码数据处理是基 于数据帧 进行的 ;
- 视频 编解码 过程中 , 一帧 视频帧 是 一张完整的图像 ;
- 如 : I 帧 内部编码帧 / 关键帧 , P 帧 前向预测帧 , B 帧 双向内插帧 ;
- 音频 编解码 过程中 , 一帧 音频帧 是 包含了一定数量的音频采样点 ;
- AAC 压缩格式 标准帧模式 一帧 音频帧有 1024 个采样点 , 短帧模式 一帧有 128 个采样点 ;
- MP3 格式一帧有 1152 个音频采样点 ;
4、数据包
FFmpeg 中的 " 数据包 " 是 从 文件容器 或 媒体流 中读取的 压缩数据 , 其中包含了 若干 压缩编码后的音频或视频帧 ;
在 数据包 中的 音频帧 或 视频帧 是压缩状态的 , 无法进行播放 ;
FFmpeg 中 数据包 中的数据 封装在 AVPacket 结构体 中 ;
将 数据包 中的数据 进行解码 , 得到的就是 数据帧 , 数据帧 可用于播放 ;
5、编解码器
编解码器 是 编码器 和 解码器 的 统称 ;
- 编码器 是 将 数据帧 编码成 数据包 的工具 ;
- 解码器 是 将 数据包 解码成 数据帧 的工具 ;
编码器 和 解码器 都是 以 帧 为单位
执行
ffmpeg -codecs
命令 , 可列出 FFmpeg 中支持的编解码器 ;
在 ffmpeg 命令中 , 可以 使用 -c:v
参数 可指定 视频编解码器
ffmpeg -i input.mp4 -c:v libx264 output.mp4
为该操作指定 H.264 视频编解码器 ;
在 ffmpeg 命令中 , 可以 使用 -c:a
参数 可指定 音频编解码器
ffmpeg -i input.wav -c:a aac output.m4a
命令 , 在该操作指定 AAC 音频编解码器 ;
6、复用器
复用器 ( Muxer ) , 又称为 封装器 , 其作用是 将多个不同的 媒体流 组合封装到一个容器文件中,以便存储或传输。
- 媒体流 : 视频流 , 音频流 , 字幕流 ;
- 容器文件 : MP4 , FLV , MKV , AVI 格式的视频文件 ;
在视频处理过程中 , 复用器 通常将编码后的 音视频流 整合到一个 文件 或 流媒体 中 ;
复用器使用示例 : 执行
ffmpeg -i input.h264 -i input.aac -c:v copy -c:a copy -f mp4 output.mp4
命令 , 将 input.h264 视频 和 input.aac 音频 封装到 output.mp4 容器文件 中 ;
7、解复用器
解复用器 ( Demuxer ) , 又称为 解封装器 , 其作用是 将 容器文件 中的 音视频流 分离出来 , 供解码器进一步处理 ;
解复用器 从 文件容器 中提取的 音视频流数据包 封装到 AVPacket 结构体 中 , 然后交给对应的 解码器 处理 , 最终 还原成原始音视频帧 并封装到 AVFrame 结构体中 ;
解复用器示例 : 执行
ffmpeg -i input.mp4 -c:v copy -an output.h264 -c:a copy -vn output.aac
命令 , 可以 将 MP4 格式的 容器文件 input.mp4 中 包含的 H.264 视频流 和 AAC 音频流 提取出来 , 分别存放到 output.h264 和 output.aac 文件中 ;