0

问题不在于库或工具,而在于 YUV 4:2:0 电影流的规范(标准或概括定义)。

YUV 420 电影流是否只是一些连接的 YUV 图像,如果是,这些帧和流的规格是什么?

我想为 YUV 420 助手制作一个简单的图像,但如果碰巧它还需要一些计算/压缩/预测,我就投降了。如果它只是需要将图像转换为 YUV 然后将它们附加在一起,我将对其进行编码并在此处共享 C# 源代码。

4

2 回答 2

2

两种方式:第一种实际上只是连接 YUV 图像(注意平面的顺序通常是 YVU,而不是 YUV)。对于单帧格式,例如 YV12 格式,这是在内存中布置 YUV 420 图像的一种方式。

另一种方法是 MPEG 格式的 YUV,它的作用相同,但以一些标头信息开头:例如,请参见此处:http ://wiki.multimedia.cx/index.php?title=YUV4MPEG2

如果您有一个用于 MPEG 文件的 YUV,那么您在文件中拥有使用它所需的所有信息。如果你有一个原始的 YUV 文件,你需要知道分辨率、帧速率和二次采样才能使用它。

另一个有趣的问题是,有不同的方法可以将 4:4:4 YUV 图像转换为 4:2:0 YUV 图像,具体取决于您放置子采样网格的位置。隔行扫描也使这有点复杂。

于 2013-09-01T18:03:56.850 回答
0

这是一个非常古老的话题,但我花了相当长的时间来修复我的 YUV4MPEG2 未压缩视频例程,所以我决定把它写下来。

重要的是要理解 Y、U、V 帧被写成单独的帧。最简单的方法是以 444 格式写入,因为您每次只需加载一个输入图像。

假设您有 800x600 像素的图像,名称为 image1、image2...,并且想要 5 fps 的帧速率:

先写一个字符串头:

        'YUV4MPEG2 W800 H600 F05:1 Ip A0:0 C444'+#10

加载输入 image1 并写入一个以 char 10 结尾的字符串 head FRAME:

        'FRAME'+#10

写入完整的 800x600 像素 Y 帧,其中 Y:=trunc(R x 77/256 + G x 150/256 + B x 29/256) 并且 R、G、B 是红色、绿色和蓝色像素值。Y 是一个 1 字节的值

         YYYY
         YYYY
         YYYY
         YYYY

写入完整的 800x600 像素 U 帧,其中 U:=trunc(R x -43/256 + G x -84/256 + B x 127/256 +128) 和 R,G,B 是红色、绿色和蓝色像素值。U 是 1 个字节的值。

         UUUU
         UUUU
         UUUU
         UUUU

写入完整的 800x600 像素 V 帧,其中 V:=trunc(R x 127/256 + G x -106/256 + B x -21/256 +128) 和 R,G,B 是红色、绿色和蓝色像素值。V 是一个 1 字节的值。

         VVVV
         VVVV
         VVVV
         VVVV

每次对以“FRAME”+#10 开头的下一张图像重复此操作。文件可以通过 VLC、FFMPEG 和 Youtube 显示。更多信息: http ://wiki.multimedia.cx/index.php?title=YUV4MPEG2

另见 https://en.wikipedia.org/wiki/YUV

于 2020-07-29T12:48:56.857 回答