流媒体学习笔记1:一个视频文件常用属性浅析之我见(bpp/vbr/resolution/fps)

因为工作原因,经常要接触视频相关的东西,而有一些视频常见的知识之前都是只知道个大概,甚至只是知道个名字的。很有必要对相关的知识整理下记录下来,以便有需要的人可以借鉴一二。但有些观点纯粹是天地会珠海分舵自己的理解,如果有误请指出,以免荼毒后人。

位深bpp

一般一个像素是由三原色RGB不同的颜色向量组成的,再加上个代表透明度的变量Alhpa值的话就是ARGB,当然,老一点的可能只有黑白,而没有RGB等。那么图片/视频文件中究竟由多少位来表示这些不同的颜色向量代表的就是位深,如只有黑白的话2位就足够了,0代表黑1代表白。代码级别的分析其查看天地会珠海分舵之前的一篇文章《《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第三节 - 裸图RawImage》

下图是通过MediaInfo软件查看一个MP4视频文件显示的位深情况:

码率

Wikipedia的解释:媒体行业在指音频或者视频在单位时间内的数据传输率時通常使用码流或码率,单位是kbps(千位每秒)

百度百科的解析:视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。

个人见解:个人认为百度百科解析的很不清楚,怎么去理解数据传输时单位时间传送的数据位数,主要是数据传输到哪里的时候的单位时间传送数据位数?既然是码率,怎么整个解析一个”码“字都没有看到!? 如果后面加个”解码器“这样就好理解多了 - 视频数据传输到解码器进行解码播放时的单位时间传送的数据位数。所以码率还应该跟你设备的解码能力有关系,如果你有个10M的码率的视频文件,但是你的播放设备没有对应的解码能力,那么也是枉然。就好像你有前兆网络,但是网卡是百兆的,最终你得到就是百兆的速度。

再深一层理解的话,同样内容的视频,在使用不同编码压缩技术的时候码率可以是不一样的。因为不同的技术压缩比率会不一样,但是视频播放时长是固定的,所以单位时间内包含的编码信息就会不一样。当然,如果完全不进行压缩的话码率是最大的,同时视频文件也是最大的,视频也就是最清晰的。所以视频编/解码技术应该是要去挑战让码率(单位时间长度包含的数据)最小的情况下能在真正播放时还原成最清晰的视频信息。

到了当今的年代,我们看电影更多是直接网上进行播放了,那么码率跟网络速度又有什么关系呢?其实我的理解很简单,比如你的网络下行速度是1Mb/s,而你要播放的视频文件是1Mb/s的码率,那么你刚好能流畅的播放该电影视频;而如果同样的网速下面你的码率是10Mb/s,那么你只能卡卡的去看了。

所以我个人对码率会如此进行定义:单位时间内视频文件包含的视频编码信息的大小。因为视频文件都是压缩过的,所以这里更多是在指定码率下,该视频期望编码器在单位时间内需要处理的视频数据信息的大小。这里要注意视频文件的播放时间是固定的,所以码率越大,单位时间包含的信息量就越大,也就是组成视频的信息量越大,视频就越清晰。

当然,上面是为了描述简单,所以描述的情况是当视频使用的是固定码率的情况,固定码率也叫做CBR,也就是说整个媒体文件单位时间内包含的数据信息应该是一样的。这种情况对视频里面没有太多的动作切换的时候还可以,因为在短时间段内看来该视频是静止的,所以单位时间内同样数量的数据信息应该就能把图片呈现出来。但是当视频里面包含太多的快速变化的动作的时候,CBR就不适用了,如果继续使用CBR的时候,我们就会看到某些动作片里面的动作是很不连贯的,因为单位时间内没有足够的信息去描述整个动作过程中的所有阶段。这个时候VBR就出来了,也就是说在同一个视频文件里面,不同的时间段所拥有的数据量可能是不一样的,也就是码率是不一样的,在没有剧烈运动的部分码率会低一点,运动量大的地方码率会高点。所以VBR在一个媒体文件中会有多个属性,比如平均码率,最高码率,请看下图:

分辨率

这个术语比较好理解,视频都是一帧一帧的图片组合起来的,所以视频的分辨率跟每一帧图的分辨率是一致的。也就是该图片的长度包含多少个像素点,宽度包含多少个像素点,两个乘起来就是了。关于图片细节的信息,请查看本人之前的一篇文章《《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第三节 - 裸图RawImage》

所以所谓4K电视指的是4096×2160像素分辨率的电视机。有一点需要注意的是,类比上面的高码率视频需要对应的能播放高码率的设备,高分辨率的视频也需要有高分辨率的显示器才行,不然你拿个2K的电视播放个4K的源,结果还是2K。

至于dar,就是Display Aspect Ratio的缩写了,表示width比上height的比率,也就是视频宽和高的比例了。

帧率FPS

按照物理学来说,我们的眼睛只能看到过去的事情,加入你现在在看一个美女在向你招手,光线从美女的手反射到你的眼睛然后成像就需要时间,你的眼睛接收到信息后会进行处理,而你的脑袋中剩余的其实是美女的残余影像。

据说连续的24张图片在一秒钟内顺序残留在你的脑袋中,你就会看到一个连续的动画,比如美女招手这个动作。如果一秒内低于24张的话就会明显感觉美女是像机器人表演一样卡卡的。这里的24张图片每秒术语就叫做FPS,也就是说24帧率的视频对人的感知来说是动态的。下图显示了FPS的一个示例:

高于24帧的话视频的细节会呈现的越加清晰,比如进来新拍摄的电影《霍比特人》采用的就是48帧的新技术,但是因为每个细节都看的太清楚了,让习惯了在电影院看24帧电影的观众吐槽不习惯,太假之类的。比如网上的一张24FPS vs 48FPS的开车的图片就很清楚的描述了这个问题,我们已经习惯了左边的景象了,认为高速开车的时候该车就应该是模糊的,所以48FPS的电影观众应该还需要时间去适应了。

最后把自己的理解进行一下小结:

  • 位深bpp:表示用多少个位来表示ARGB。该属性影响的是我们的视频的色彩变现能力。
  • 码率:编码压缩后视频文件单位时间内包含的数据信息量,在可变码率视频编码的情况下,不同时间段的码率是不一样的。该属性影响的是视频的清晰度。
  • 分辨率:视频中一幅图片所包含的像素点信息数量,在MonkeyRunner的裸图中是以一个数组保存起来的。该属性从某一种程度上影响了视频的清晰度,因为一张图片拥有了更多像素来描述相应的细节,比如一个3K的显示器,播放4k分辨率的电影和播放1K分辨率的电影分辨获得的就是2k的清晰度和1k的清晰度。
  • 帧率:单位时间内播放的帧数。该属性主要影响的是播放的流畅度。

------------------------------------------To be Continue-----------------------------------------------------


作者


自主博客


微信


CSDN


天地会珠海分舵


http://techgogogo.com


服务号:TechGoGoGo

扫描码:


http://blog.csdn.net/zhubaitian

时间: 2024-08-28 11:38:10

流媒体学习笔记1:一个视频文件常用属性浅析之我见(bpp/vbr/resolution/fps)的相关文章

JavaWeb学习笔记——第一个JSP文件

必须加上第一句以用来指定编码,否则会出现乱码 <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" %> <html> <head> <title>这是一个title</title> </head> <body> <% out.println(

Linux 程序设计学习笔记----动手编写makefile文件

Befroe Beginning. 之前定了暑假的plan ,关于Linux的书籍现在在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 现在开始关于Linux程序设计的第一篇学习笔记. 本来打算把名字写成教程,不过觉得自己完全是新手在自学,还是写学习笔记比较负责和适合. 希望可以一起学习进步. 引入 首先我们假设这样一个场景.我们有一个程序包含了三个文件,分别是源码文件main_plus,c和function_plus.c以及头文件mydefine_p

Unix文件系统学习笔记之二: 文件描述符、inode和打开文件表

Unix文件系统学习笔记之二: 文件描述符.inode和打开文件表 系统盘上数据的布局 文件系统无非是关于数据在磁盘上的组织以及存储空间管理的,为此,首先需要知道磁盘上数据的总体布局方式.以Unix为例,最重要的一张表如下: Unix 进程管理中和用户文件.io 最相关的数据结构:usr 数据结构 The procstructure does not record information related to file access.  However the userstructure con

iOS: 学习笔记, 添加一个带界面约束的控制器

1. 创建一个空iOS应用程序(Empty Application). 2. 添加加控制器类. 修改控制器类的viewDidLoad 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 //创建标题 5 UILabel *header = [[UILabel alloc] init]; 6 header.text = @"欢迎来到我的世界!"; 7 header.textAlignment = NSTextAlignmentCenter

Lua学习笔记9:多文件

一 终端中执行多个文件:-l 加入在文件一中定义了一个变量,在另一文件中输出这个变量,代码如下: --file1.lua num = 100 --file2.lua print(num) 终端输入(注意:不是lua命令行): lua -lfile1 -lfile2 注意:不要加上文件后缀名.lua 二 命令行中加载文件 --lib.lua function norm(x, y) local n2 = x^2 + y^2 return math.sqrt(n2) end function twic

【改自lg2lh】EZ-USB 68013 学习笔记--设备信息安装文件CyUSB.inf详细说明

首先要明白一个INF文件的基本结构:INF由节组成,即一个个段组成.每个段的功能不一样.(大部分书上把这个段叫作"节") [Version]段:主要用说明版本信息的. [Strings]段:字符串信息,用于常量定义,用于显示.凡在其他段中出现的%XXXX%(就是两个百分号夹着一组字母),则对应的就会在Strings段里对应着它的一个字符串. [SourceDisksNames]段:定义安装源文件所在磁盘,一般为1,表示在第一个磁盘.此节可无. [SourceDiskFiles]段:驱动

【学习ffmpeg】打开视频文件,帧分析,并bmp保存关键帧

http://www.tuicool.com/articles/jiUzua http://blog.csdn.net/code_future/article/details/8646717 主题 FFmpeg 任务:需要把一个视频文件的每一帧提取出来,每帧存储成单独的文件. 以前用Matlab处理过这个问题,可是感觉比较慢,而且最近正在逐步转向使用开源的东西.因此搜到ffmpeg这个好东西. ffmpeg可用来处理视频文件的提取和各种转换,跨平台,官网上有Linux,WINDOWS和MAC版本

《鸟哥的Linux私房菜》学习笔记(1)——文件与目录

在Linux中,任何设备都是文件,不仅如此,连数据通信的接口也有专门的文件负责.可以说,一切皆文件,目录也是一种文件,是路径映射.因此,文件系统是Linux的基础. 一.文件与目录管理命令 1.ls(list)--查看文件与目录命令 在linux中,该命令可能是最多被执行的,因为我们随时要知道文件或者目录的相关信息.ls命令默认显示非隐藏文件的文件名(以文件名进行排序)以及文件名代表的颜色. 命令格式:ls [选项] [目录名] 常用参数: -l(long):列出长字符串,包含文件的属性与权限等

linux学习笔记(1)-文件处理相关命令

列出文件和目录 ls (list) #ls 在终端里键入ls,并回车,就会列出当前目录的文件和目录,但是不包括隐藏文件和目录 #ls -a 列出当前目录的所有文件 #ls -al 列出当前目的所有文件的详细信息 创建目录 mkdir (make directory) #mkdir test 在当前目录创建test的目录 显示当前目录 pwd (print working directory) #pwd 打印当前目录 切换到其他目录 cd (change directory) #cd 目录名 复制