使用pygame
在python中使用YUV查看器。
以下代码显示YUV 4:2:0
的一帧#!/usr/bin/env python
import pygame
W = 352
H = 288
WH = (W, H)
pygame.init()
screen = pygame.display.set_mode(WH)
overlay = pygame.Overlay(pygame.YV12_OVERLAY, WH)
fd = open('foreman.yuv', 'rb')
y = fd.read(W * H)
u = fd.read(W * H / 4)
v = fd.read(W * H / 4)
overlay = pygame.Overlay(pygame.YV12_OVERLAY, WH)
overlay.display((y, u, v))
此代码在位置(0,0)
中显示一个16x16半透明矩形pygame.init()
screen = pygame.display.set_mode(WH)
s = pygame.Surface((16,16))
s.set_alpha(128)
s.fill((255,255,255))
screen.blit(s, (0,0))
pygame.display.flip()
但是,我该如何组合它们呢?即如何在YUV数据顶部的位置(0,0)显示半透明矩形,以便通过矩形看到YUV数据?
答案 0 :(得分:2)
这是一个重要的事情。你不能把其他东西“放在首位”:来自docs:
叠加层对象始终可见,并且始终显示上方 定期展示内容。
YUV叠加到媒体播放器通常用于显示视频的硬件。内容通常永远不会写入“帧缓冲区”(对屏幕截图/屏幕捕获软件等空白区域造成无尽的悲痛)。
所以你必须直接在“y,u,v”数据中绘制你想要添加的内容。 (或者将y,u,v数据转换为RGB数据并通过更传统的方式显示它。)
答案 1 :(得分:0)
以为我会发布我是如何从yCbCr转换到pygame中的表面的,因为我找不到使用谷歌的任何解决方案。
#!/usr/bin/env python
import pygame
import Image
import sys
W = 352
H = 288
WH = (W, H)
pygame.init()
screen = pygame.display.set_mode(WH)
fd = open('foreman.yuv', 'rb')
y = fd.read(W * H)
u = fd.read(W * H / 4)
v = fd.read(W * H / 4)
fd.close()
# Use PIL to get a black-n-white version of the YCbCr
# and convert it to RGB
im = Image.fromstring('L', WH, y)
rgb = im.convert('RGB')
s = pygame.image.frombuffer(rgb.tostring(), rgb.size, rgb.mode)
screen.blit(s, (0,0))
pygame.display.flip()