文章目录

  • 一、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 编码 ;

【FFmpeg】FFmpeg 播放器框架 ③ ( FFmpeg 中的音视频相关术语 | 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用器 | 解复用器 )_ffmpeg



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】FFmpeg 播放器框架 ③ ( FFmpeg 中的音视频相关术语 | 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用器 | 解复用器 )_音视频_02

在视频处理过程中 , 复用器 通常将编码后的 音视频流 整合到一个 文件 或 流媒体 中 ;



复用器使用示例 : 执行

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 ) , 又称为 解封装器 , 其作用是 将 容器文件 中的 音视频流 分离出来 , 供解码器进一步处理 ;

【FFmpeg】FFmpeg 播放器框架 ③ ( FFmpeg 中的音视频相关术语 | 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用器 | 解复用器 )_ffmpeg_03

解复用器 从 文件容器 中提取的 音视频流数据包 封装到 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 文件中 ;