2011-08-17 186 views
2

民间,什么是视频编解码器的解码输出?

我想知道如果有人可以向我解释什么是视频解码的输出。假设这是一个MP4容器中的H.264流。

从屏幕上显示的东西,我想解码器可提供两种不同类型的输出:

  1. 点 - (X,Y)的位置和(R,G,B)颜色的坐标像素
  2. 矩形(X,Y,W,H)单位为矩形和(R,G,B)颜色来显示

还有时间戳的问题。

您能指点我或指出解码器生成的内容的正确链接,以及视频客户端如何使用此信息在屏幕上显示内容?

我打算下载VideoLAN源并检查它,但一些解释会有帮助。

非常感谢您的帮助。

问候, 彼得

回答

4

以上皆非。

通常,输出将是只包含颜色数据的字节流。 X,Y位置由视频的尺寸所暗示。

换句话说,前三个字节可能在(0,0)处编码颜色值,在(0,1)处编码值的第二个三字节等等。某些格式可能使用四个字节组,或者甚至不加一个字节的位数 - 例如,如果每个颜色分量使用5位,并且您有三个颜色分量,即每像素15位。这可能会被填充到16位(正好两个字节)以提高效率,因为这样可以使数据以CPU更好地处理它的方式对齐。

当您处理的视频宽度相同时,您已达到该行的末尾。当您处理的视频数量很多时,您的行数就已经达到了该帧的结尾。

至于这些字节的解释,这取决于编解码器使用的色空间。常用色彩空间为YUV,RGBHSL/HSV

它强烈依赖于正在使用的编解码器以及它支持的输入格式;输出格式通常仅限于可接受输入格式的集合。

时间戳数据有点复杂,因为它可以在视频流本身或容器中进行编码。至少,该流将需要一个帧率;由此可以通过计算已经解码了多少帧来确定每帧的时间。其他方法,如AVI采用的方法,是在文件末尾为每个第N帧(或仅关键帧)包含一个字节偏移量,以实现快速搜索。 (否则,您需要解码每帧到您要查找的时间戳,以便确定文件中该帧的位置。)

如果您也在考虑音频数据,请注意,对于大多数编解码器和容器,音频和视频流是独立的,彼此之间一无所知。在编码过程中,将两个流写入容器格式的软件进行一个称为复用的过程。它将每个数据块以N秒为单位写出数据,并在数据流之间交替。这允许正在读取流的人获得N秒的视频,N秒的音频,然后是另外的N秒的视频,等等。 (也可能包含多个音频流 - 这种技术通常用于将视频和英语和西班牙语音轨混合到包含三个流的单个文件中。)实际上,即使是字幕也可以与其他音频混合流。

+0

cdhowie。非常感谢你的解释。我有一个后续问题。根据您所描述的,视频客户端必须独立绘制每个帧。考虑到连续帧之间的变化非常小,这不会是太多的CPU/GPU消耗吗?是否让视频客户端将前一帧与下一帧进行比较,确定需要重绘的像素并在屏幕上绘制该部分? – Peter

+1

@Peter看起来好像很多CPU,但事实并非如此。通常通过在视频卡驱动程序的帮助下将帧缓冲区推送到视频卡,在一个操作中绘制帧。还有支持硬件视频解码的视频卡,因此软件应用程序实际上会将*压缩*视频流发送到GPU,并将其解码并直接显示在显示器上,几乎不需要CPU参与。即使没有这些优化,现代CPU也非常快,可以轻松处理这样的任务。 – cdhowie

0

cdhowie得到了大部分。 说到时间戳,MPEG4容器包含每个帧的表格,告诉视频客户端何时显示每一帧。您应该查看MPEG4的规格。您通常需要为此付费,但绝对可以从地方下载。

http://en.wikipedia.org/wiki/MPEG-4_Part_14

+0

Adob​​e的F4V视频文件格式是MPEG4的超集,可以从http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf – Perry

+0

James下载(免费)规格。感谢你的帮助。随后的问题。我发现有两种方法可以让视频客户端进行处理。 1)始终查看时间表,“查找”当前时间的位置,并处理解码器输出。 2)只要继续获取下一帧,并继续处理,但只有在发现时间表落后的时候才查找时间表。视频客户端使用的一般方法是什么? – Peter