YUV 是一种在视频处理和压缩中常用的颜色空间。
它将图像的亮度 (Y) 与色度 (U 和 V) 成分分开。
这种分离对视频压缩和广播非常有益,
因为人眼对亮度变化比对颜色变化更敏感。
YUV 组件简介
- Y (亮度):表示图像的亮度或灰度信息。
- U (色度):表示颜色差异的蓝色投影。
- V (色度):表示颜色差异的红色投影。
RGB 转换为 YUV
RGB 转换为 YUV 的公式如下:
[ Y = 0.299R + 0.587G + 0.114B ]
[ U = 0.492 (B - Y) ]
[ V = 0.877 (R - Y) ]
使用 FFmpeg 进行 YUV 转换
FFmpeg 可以将视频文件从一种格式转换为另一种格式,包括转换为 YUV 格式或从 YUV 格式转换。以下是将 RGB 视频转换为 YUV 的示例命令:
ffmpeg -i input.mp4 -pix_fmt yuv420p output.yuv
此命令将 input.mp4
转换为使用 yuv420p
像素格式的 YUV 格式,并保存为 output.yuv
。
IPB 是视频编码中的帧类型,通常用于描述视频压缩算法中的帧结构。以下是 IPB 帧的具体介绍:
I 帧(关键帧或独立帧)
- I 帧 是独立帧,包含完整的图像数据,可以不依赖其他帧进行解码。
- 它们在视频流中通常用作参照点,方便随机访问。
- 编码和解码 I 帧所需的比特率较高,但提供较高的质量。
P 帧(预测帧)
- P 帧 依赖于前面的 I 帧或 P 帧,通过预测和差异编码来减少数据量。
- 它只存储相对于前一帧的变化部分,因此比 I 帧需要更少的比特率。
- 解码 P 帧时需要参考前面的 I 帧或 P 帧。
B 帧(双向预测帧)
- B 帧 依赖于前后的 I 帧和 P 帧,通过双向预测进行编码。
- B 帧能有效地压缩视频,因为它可以从两侧帧的信息中进行插值。
- B 帧的解码依赖于前后的 I 帧或 P 帧。
使用 FFmpeg 处理 IPB 帧
ffmpeg -i input.mp4 -vf showinfo -f null -
此命令将 input.mp4
的帧信息显示在控制台上,其中包括每一帧的类型(I、P 或 B)。
PTS(Presentation Time Stamp,显示时间戳)
和 DTS(Decoding Time Stamp,解码时间戳)
是音视频编码中的两个重要概念,用于同步和播放音视频流。
PTS(显示时间戳)
- PTS 指示一个视频帧或音频样本应该在何时显示或播放。
- 它用于确保音视频流在正确的时间点同步播放。
- 通常,在视频解码和播放过程中,PTS 会告诉播放器何时显示当前帧。
DTS(解码时间戳)
- DTS 指示一个视频帧或音频样本应该在何时解码。
- 在某些情况下,特别是涉及到 B 帧时,帧的解码顺序可能与显示顺序不同。
- DTS 确保帧按照正确的顺序解码,以便随后按 PTS 顺序显示。
使用 FFmpeg 查看 PTS 和 DTS
你可以使用 FFmpeg 查看视频文件中帧的 PTS 和 DTS 信息。以下是一个示例命令,显示如何查看视频文件的时间戳信息:
ffmpeg -i input.mp4 -vf showinfo -f null -
这个命令会在控制台中显示 input.mp4
的帧信息,包括 PTS 和 DTS 时间戳。
调整 PTS 和 DTS
在某些情况下,可能需要调整 PTS 和 DTS,
例如修正音视频不同步的问题。以下是一个示例,展示如何使用 FFmpeg 调整 PTS:
ffmpeg -i input.mp4 -vf "setpts=PTS+2/TB" output.mp4
这个命令将 input.mp4
的 PTS 调整为原来的 PTS 加上 2 秒,并保存为 output.mp4
。
视频的编码和解码过程是将视频数据压缩和解压缩的技术,用于减少视频文件的大小,同时尽可能保持视频质量。这个过程主要包括以下几个步骤:
视频编码过程
-
采集和预处理:
- 从摄像设备获取原始视频数据(通常是 RGB 格式)。
- 进行预处理,如色彩空间转换(将 RGB 转换为 YUV)和帧间去噪。
-
帧类型划分:
- 将视频分割成 I 帧(关键帧)、P 帧(预测帧)和 B 帧(双向预测帧)。
-
帧内压缩(Intra-frame Compression):
- 对每一帧进行压缩,通常使用离散余弦变换(DCT)来减少空间冗余。
-
帧间压缩(Inter-frame Compression):
- 利用帧之间的相似性,通过运动估计和补偿来减少时间冗余。
-
量化:
- 将变换后的系数进行量化,进一步减少数据量。量化级别越高,压缩比越大,但质量可能会降低。
-
熵编码:
- 使用熵编码(如霍夫曼编码或算术编码)对量化后的数据进行进一步压缩。
-
封装:
- 将压缩后的视频流与音频流、多媒体数据流等一起封装成一个多媒体容器格式(如 MP4、MKV 等)。
视频解码过程
-
解析封装格式:
- 从多媒体容器中提取压缩的视频流。
-
熵解码:
- 对压缩数据进行熵解码,还原量化后的变换系数。
-
反量化:
- 对量化后的系数进行反量化,还原接近原始的变换系数。
-
帧间解压缩(Inter-frame Decompression):
- 使用运动补偿还原帧间压缩的数据,重建 P 帧和 B 帧。
-
帧内解压缩(Intra-frame Decompression):
- 对每一帧进行反DCT变换,重建帧内压缩的数据。
-
重建视频帧:
- 将 YUV 数据转换回 RGB 格式,重建出完整的视频帧。
-
显示和同步:
- 使用 PTS 来同步音视频流,在正确的时间点显示每一帧。
使用 FFmpeg 进行视频编码和解码
以下是使用 FFmpeg 进行视频编码和解码的示例命令:
编码
将原始视频编码为压缩格式,例如 H.264 编码的 MP4 文件:
ffmpeg -i input.raw -c:v libx264 output.mp4
解码
将压缩格式的视频解码为原始视频帧:
ffmpeg -i input.mp4 -f rawvideo output.raw
音频概念
- 比特率:表示经过编码(压缩)后的音频数据每秒钟需要用多少个比特来表示单位常为kbps。
- 响度和强度:声音的主观属性响度表示的是一个声音听来有多响的程度响度主要随声音的强度而变化,但也受频率的影响。总的说,中频纯音听来比低频和高频纯音响一些
- 采样和采样率:采样是把连续的时间信号,变成离散的数字信号。采样率是指每秒钟采集多少个样本
容器-整合音视频:
- 单个这样的文件包含所有的流(主要是音频和视频),并提供同步和通用元数据,比如标题、分辨率等等。
- 一般我们可以通过文件的后缀来判断文件格式:比如video.webm通常是一个使用webm容器格式的视频。一个video.mp4是MP4容器格式。
注意同步
FFmpeg常用API简介
FFmpeg&&Android