问题不是关于库或工具,而是关于YUV 4:2:0电影流的规范(标准或汇总定义)。
YUV 420电影流只是一些连接的YUV图像,如果是这样,这些帧和流的规格是什么?
我想为YUV 420助手制作一个简单的图像,但如果它发生它还需要一些计算/压缩/预测,我只会投降。如果它只需要将图像转换为YUV然后将它们附加在一起,我将对其进行编码并在此处共享C#源。
答案 0 :(得分: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图像有不同的方法,具体取决于放置子采样网格的位置。隔行扫描也使这有点复杂。
答案 1 :(得分:0)
这是一个非常古老的话题,但是我花了一些时间来修复YUV4MPEG2未压缩的视频例程,所以我决定将其写下来。
要理解的重要一点是,Y,U,V帧被写为单独的帧。最简单的方法是以444格式写入,因为每次只需加载一个输入图像。
假设您有800x600像素的图像,将其命名为image1,image2 ...,并希望帧率为5 fps:
首先编写一个字符串标题:
'YUV4MPEG2 W800 H600 F05:1 Ip A0:0 C444'+#10
加载输入image1并写一个以char 10结尾的字符串头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