问题不在于库或工具,而在于 YUV 4:2:0 电影流的规范(标准或概括定义)。
YUV 420 电影流是否只是一些连接的 YUV 图像,如果是,这些帧和流的规格是什么?
我想为 YUV 420 助手制作一个简单的图像,但如果碰巧它还需要一些计算/压缩/预测,我就投降了。如果它只是需要将图像转换为 YUV 然后将它们附加在一起,我将对其进行编码并在此处共享 C# 源代码。
问题不在于库或工具,而在于 YUV 4:2:0 电影流的规范(标准或概括定义)。
YUV 420 电影流是否只是一些连接的 YUV 图像,如果是,这些帧和流的规格是什么?
我想为 YUV 420 助手制作一个简单的图像,但如果碰巧它还需要一些计算/压缩/预测,我就投降了。如果它只是需要将图像转换为 YUV 然后将它们附加在一起,我将对其进行编码并在此处共享 C# 源代码。
两种方式:第一种实际上只是连接 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 图像,具体取决于您放置子采样网格的位置。隔行扫描也使这有点复杂。
这是一个非常古老的话题,但我花了相当长的时间来修复我的 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