音视频的那几个关键参数
视频文件常含有视频流和音频流(有的甚至存在字幕流),每路流均具有一套参数来描述其特性:如音频流的采样率、通道数、位深、编码方式等,视频流的分辨率、帧率、颜色空间等,这些参数不仅影响到文件的质量,也影响到文件的大小和播放效果。因此,在音视频处理中,了解这些参数的含义和作用至关重要。
本文在通过FFmpeg接口打印某视频文件基本信息的基础上,对部分关键参数进行说明。
1. FFmpeg 打印文件信息
FFmpeg 提供了一些强大的接口来打开和读取媒体文件,通过这些接口,我们可以轻松地获取音视频文件的各种信息。主要涉及如下三个接口:
代码语言:javascript复制//打开媒体文件
//参数:ctx:FFmpeg 用于处理媒体文件信息的上下文。
//参数:filename:媒体文件的路径。
//参数:fmt:输入格式,通常为 NULL,FFmpeg 会自动检测。
//参数:options:输入流的选项,通常为 NULL。
//返回值:成功返回 0,失败返回负数。
int avformat_open_input(AVFormatContext *ctx, const char *filename, AVInputFormat *fmt, AVDictionary options)
//关闭媒体文件
//参数:ctx:需要关闭的媒体文件上下文。
//返回值:无
void avformat_close_input(AVFormatContext ctx)
//打印文件信息
//参数:ctx:输入文件的上下文。
//参数:index:流的索引。
//参数:url:文件的 URL(路径)。
//参数:is_output:0表示输入,1表示输出。ctx为输入文件但是is_output为1时,打印信息为空
//返回值:无。
void av_dump_format(AVFormatContext *ctx, int index, const char *url, int is_output)示例代码如下:
代码语言:javascript复制#include
extern "C"
{
#include"libavformat/avformat.h"
}
int main()
{
std::string file_path = "e://1.mp4";
AVFormatContext* fmt_ctx = nullptr;
auto ret = avformat_open_input(&fmt_ctx, file_path.c_str(), nullptr, nullptr);
if (ret < 0)
{
std::cout << "avformat_open_input failed, ret = " << ret<< std::endl;
return -1;
}
av_dump_format(fmt_ctx, 0, file_path.c_str(), 0);
avformat_close_input(&fmt_ctx);
return 0;
}注意:
如上代码只是展示了接口调用部分,涉及到依赖库、依赖头文件的配置,读者可以自行配置,此处不做展开。由于我使用的是7.0.2版本的FFmpeg,所以没有调用av_register_all()函数,此处按需调用。不过我建议大家使用第三方库时,使用次新版本的开源库。程序打印的文件的基本信息如下
代码语言:javascript复制Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'e://1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf61.7.100
description : Bilibili VXCode Swarm Transcoder v1.0.26
Duration: N/A, bitrate: N/A
Stream #0:0[0x1](und): Video: h264 (avc1 / 0x31637661), none(tv, bt709), 480x360, 319 kb/s, SAR 1:1 DAR 4:3, 30 fps, 30 tbr, 16k tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, 2 channels, 129 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]由如上信息可知,打印信息共分为三个部分:
文件元数据:以Metadata开头,视频流信息: 以Stream开头,后跟随Video标识,其中 h264表示编码格式,avc1表示编码器,none表示颜色空间,tv表示色域,bt709表示色度, 480x360表示分辨率,30 fps表示帧率, 319 kb/s表示码率,SAR 1:1 DAR 4:3表示宽高比 30 fps表示帧率,每秒30帧 16k tbn表示时间基,即每一秒钟有16k个时间基,音频流信息: 以Stream开头,后跟随Audio标识,其中: aac表示音频编码格式,mp4a表示编码器, 48000 Hz表示采样率, 2表示通道数, 129 kb/s表示码率。2.参数的作用与影响
如上揭示了文件的关键信息的基本含义,接下来我们深入解析每个参数的含义及其对音视频质量的影响。
2.1 视频相关参数
分辨率:分辨率决定了视频的清晰度。高分辨率的视频拥有更多的像素,能呈现更细腻的画面,但同时也会增加文件的大小和解码压力。如360p(640x360)、480p(854x480)、720p(1280x720)、1080p(1920x1080)、2K(2048x1080)、4K(3840x2160),分辨率越高,细节越多,越适合大屏播放。
帧率:帧率(FPS)决定了每秒显示的帧数。帧率越高,画面就越流畅,延迟越低,但同时也会增加存储和带宽需求。常见的帧率有15FPS(监控)、24FPS(电影)、30FPS(常见视频)和60FPS(高帧率视频)。
颜色格式:颜色格式决定了如何表示每个像素的颜色信息。常见的格式有 `YUV420p`、`YUV422p`、`RGB` 等。`YUV420p` 主要用于视频压缩,因为它能够在保持视觉质量的同时减少带宽需求。
编码器:编码器是视频压缩和解压的核心部分,它决定了视频文件的压缩效率和质量。常见的视频编码器有 H.264、H.265/HEVC、VP9 等。
H.264:最常用的视频编码标准,适用于大部分设备和平台,具有较好的压缩效率; H.265/HEVC:比 H.264 更高效,能够以更低的码率提供相同或更好的视频质量,适用于高分辨率视频(如 4K); VP9:Google 开发的视频编码格式,主要用于 YouTube 等平台,压缩效率高于 H.264。
2.2 音频相关参数
采样率:采样率决定了每秒钟从模拟音频信号中取样的次数。较高的采样率意味着音频数据的精度更高,质量更好,但文件体积增大、带宽需求变大。常见的采样率为 44100 Hz(CD音质)和 48000 Hz(用于专业音频和视频),对于语音或低保真音频,更低的采样率(22050Hz)也可以接受。
通道数:音频的通道数决定了音频的立体声效果或多声道效果。常见的有单声道(1个通道)、立体声(2个通道)、以及多声道(5.1、7.1、7.1.2、7.1.4等)。单声道音频,适用于简单的语音录音;双声道立体声音频,适用于普通的音乐和音频播放;5.1和7.1环绕声音频,适用于家庭影院和高质量音频播放;5.1.2、7.1.2、7.1.4全景声音频,适用于家庭影院、游戏和专业音频应用。
位深:位深度(Bit Depth)决定了音频每个样本的表示精度,通常有 16位、24位、32位等。16位表征音频采样点的数值可以精细到2的16次方分之一。位深越高,数值越精细,越能够捕捉到更精细的音频细节。
编码器:音频编码器决定了音频的压缩效率和质量。常见的音频编码器有 AAC、MP3、Opus 等。
MP3:经典的音频编码格式,压缩效果好,但在高压缩比下会损失音质; AAC:比 MP3 更高效,广泛用于现代流媒体应用,提供更好的音质; Opus:适用于低延迟语音通信,具有出色的音质和低比特率。
3. 总结
通过本文的讲解,我们深入探讨了音视频文件的基本信息及其关键参数,包括视频的分辨率、帧率、颜色格式、码率,音频的采样率、通道数、位深和编码方式等。在实际应用中根据需要调整这些参数,从而优化视频和音频的质量。能够帮助我们在实际项目中更好地进行转码、剪辑、播放等操作。

