【音视频处理】码率、帧率越高越清晰?分辨率、像素、dpi之间是什么关系?码率的真实作用,I帧、B帧、P帧是什么

大家好,欢迎来到停止重构的频道。

本期我们介绍一下视频的一些基础概念,如帧率、码率、分辨率、像素、dpi、视频帧、I帧、P帧、gop等。

会解释多少码率是清晰的,是否帧率越高越流畅等问题。

这些概念是比较杂乱的,我们按这样的顺序介绍:

1、单个视频帧的概念

2、多个视频帧的概念

3、H264、H265的特殊概念

单个视频帧的概念

单个视频帧可以简单地理解为一个图片

单个视频帧的概念有:分辨率、像素、dpi、色彩空间模型

分辨率指的是图像的长宽像素大小,分辨率也有720、1080、2K、4K的说法。

由于视频分辨率一般是16:9的,所以1080一般指1920X1080,其他分辨率如图所示。

细心的小伙伴可能会发现,有时候分辨率后面会加一个P,如1080P等。当然,除了1080P,还有1080I 。

这里的P(逐行扫描)、I(隔行扫描-)指的是扫描方式

虽然理论上隔行扫描(1080I)可以节省带宽,但是,一般来说,1080i这种隔行扫描是电视节目用的。网络视频、视频文件一般都是1080p这种逐行扫描。

这里顺便一提,如果视频播放时出现了锯齿,一般就是采用了隔行扫描(1080I等)的问题。

接下来是像素,像素其实很简单,就是分辨率长宽相乘,如1920X1080分辨率对应的像素就是200万(2073600)像素。

那么多少分辨率才是清晰的呢?取决于dpi ,也就是每英寸的像素多少。

但是dpi实际上并不是视频的一个参数,dpi理论上取决于显示设备和视频分辨率参数

至于多少dpi是清晰的,往往是根据实际场景决定的,毕竟观看距离也起了决定性的因素,如海报等印刷品就要求300dpi。

最后是色彩空间模型,色彩空间模型一般是RGB、YUV这些 ,实际上就是像素点记录色彩数据的方式。

不同色彩空间模型决定色彩的丰富程度,当然也决定着每个像素的数据量大小

一般来说:网络视频、图片都会采用YUV420这种数据量较少的色彩空间模型,虽然色彩存在一定程度的失真,但是数据量较少,以至于文件不会太大。

多个视频帧的概念

多个视频帧的概念,其概念有帧率、播放时间戳PTS、码率

帧率就是一秒的视频帧数,单位是fps,可以简单地理解为一秒切换的图片数量。

一般认为,一秒18帧以上才能看起来是流畅的。

但是这需要根据实际场景而定,电影一般是一秒24帧,游戏需要一秒30帧以上才是流畅的。

这涉及到人的视觉对模糊图像和静止图像切换的感受是不一样的缘故,所以会存在一些具体场景的最低要求偏差。

但是一般来说,网络视频、视频文件具备每秒25帧以上就可以了

但是帧率实际上并不能直接对视频帧的显示造成影响,很多时候,帧率只是一个平均值

因为帧率并不能说明每一帧的具体显示时间,比如每秒30帧,你会发现1帧的时间是0.033… 是一个无限小数。

真正影响视频帧显示的是播放时间戳PTS,在每一个视频帧数据中,都会记录此视频帧的播放时间戳PTS,每个时间戳都是整数,需要根据时间基才能换算成具体时间。

接下来是码率,码率是1秒的数据量大小,单位是Mbps。

很多人说,码率越大越清晰,感官上确实是这样的。

但是在音视频处理中,如直播转码中,实际上码率的设置是为了限制数据量的大小

因为这会影响到网络加载时间,如果码率较大,而带宽不足,那视频会一卡一卡的

一般来说,码率只是一个平均值,在音视频处理时,只需要设置最大码率

设置最大码率后,编码器可能会对视频数据进行有损压缩,所以较低码率的视频感官上是不清晰的。

这里的有损压缩只是可能,因为是否压缩,取决于原始数据量的大小,原始数据量的大小又取决于分辨率、帧率、图像的色彩空间模型、编码格式等因素

一般来说,1920X1080分辨率、30帧、H264编码的视频,最大码率设置为2或3Mbps一般都是清晰的。

当然,最大码率的限制需要看具体场景,有时候为了节省手机客户端的流量,可能会设置很低的最大码率。

H264、H265的特殊概念

最后是介绍一下出现在H264、H265编码格式的一些特殊概念:I帧、B帧、P帧、GOP

浏览器一般都支持H264编码的视频,H265与H264较为相似,只是H265比H264拥有更高的压缩能力,但同时H265编码的视频在播放时消耗性能也会更多。

H264、H265的编解码器是现成的,其具体算法和工作原理是不需要知道的,但是我们仍然需要知道I帧、P帧、B帧的概念。

其实是为了压缩相似帧的一种手段

I帧是能独立播放的,是完整的视频帧

P帧是需要根据前一个I帧或P帧计算所得。

B帧是需要根据前一个和后一个I帧或P帧计算所得。

I帧是数据量最大的,一般会出现在画面突变的位置,所以一些视频识别软件会优先处理I帧图像,这样有利于快速处理。

B帧虽然是数据量最小的,但是它需要后一个帧数据才能计算出来,所以在直播流等场景下,一般是不生成B帧的,这样有利于直播的流畅。

另外,还有一个对于直播流等流媒体来说非常重要的概念gop,gop指的是一组完整的视频帧 。

如gop设置为25,那么编码器会让每25帧的第一帧必定为I帧,如果帧率也是25帧,那每秒的第一帧就必定是I帧。

这样做的好处是,直播流出现画面花掉的概率会降低,信号中断重连后,直播流也能更快地重新播放,因为P帧、B帧实际上都需要依赖I帧才能计算出来,一般对于直播流而言,gop一般设置为帧率的1-2倍。

总结

以上是关于视频一些概念,这些概念非常重要,是视频处理中需要斟酌的设置,至于音频相关的概念,会在之后的内容中补充。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 Python 使用 `ffmpeg` 分析视频的各种信息,你可以使用 `ffprobe` 工具。`ffprobe` 是 `ffmpeg` 套件中的一个工具,用于分析多媒体文件的信息。以下是一个基本的实现方法: 1. 安装 `ffmpeg`: - 对于 Windows 用户,可以从官方网站(https://www.ffmpeg.org/)下载预编译的二进制文件,并将其添加到系统路径中。 - 对于 Linux 用户,可以使用包管理器安装 `ffmpeg`,如 `apt-get` 或 `yum`。 - 对于 macOS 用户,可以使用 Homebrew 安装 `ffmpeg`,如 `brew install ffmpeg`。 2. 使用 `subprocess` 模块调用 `ffprobe`: ```python import subprocess import json video_path = 'path/to/your/video.mp4' # 定义 ffprobe 命令 ffprobe_cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', video_path] # 执行 ffprobe 命令 result = subprocess.run(ffprobe_cmd, capture_output=True, text=True) # 解析 ffprobe 输出 data = json.loads(result.stdout) ``` 3. 提取视频信息: ```python # 提取视频流信息 video_stream = next((stream for stream in data['streams'] if stream['codec_type'] == 'video'), None) # 分辨率 resolution = (video_stream['width'], video_stream['height']) # 码(平均码) bitrate = int(video_stream['bit_rate']) // 1000 # 单位转换为 kbps # 帧 framerate = eval(video_stream['r_frame_rate']) # 将字符串转换为浮点数 # I 帧间隔(GOP) gop_size = int(video_stream['tags']['r_frame_rate'].split('/')[1]) # 是否开启 SVC(需要根据具体情况判断) has_spatial_layers = 'spatial_layers' in video_stream['tags'] ``` 完整的示例代码如下: ```python import subprocess import json video_path = 'path/to/your/video.mp4' # 定义 ffprobe 命令 ffprobe_cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', video_path] # 执行 ffprobe 命令 result = subprocess.run(ffprobe_cmd, capture_output=True, text=True) # 解析 ffprobe 输出 data = json.loads(result.stdout) # 提取视频流信息 video_stream = next((stream for stream in data['streams'] if stream['codec_type'] == 'video'), None) # 分辨率 resolution = (video_stream['width'], video_stream['height']) # 码(平均码) bitrate = int(video_stream['bit_rate']) // 1000 # 单位转换为 kbps # 帧 framerate = eval(video_stream['r_frame_rate']) # 将字符串转换为浮点数 # I 帧间隔(GOP) gop_size = int(video_stream['tags']['r_frame_rate'].split('/')[1]) # 是否开启 SVC(需要根据具体情况判断) has_spatial_layers = 'spatial_layers' in video_stream['tags'] print('Resolution:', resolution) print('Bitrate:', bitrate) print('Framerate:', framerate) print('GOP Size:', gop_size) print('Has Spatial Layers:', has_spatial_layers) ``` 上述代码将输出视频的分辨率、码、帧、I 帧间隔和是否开启 SVC 等信息。请确保将 `'path/to/your/video.mp4'` 替换为实际的视频文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值