为了账号安全,请及时绑定邮箱和手机立即绑定

使用 pygame 覆盖显示 YUV420p 会导致图像顶部出现绿色条

使用 pygame 覆盖显示 YUV420p 会导致图像顶部出现绿色条

子衿沉夜 2021-09-11 15:37:40
代码如下。图像由 PyAV 库解码。在图片的顶部有一个水平的绿色条。大概1个像素高度。你知道如何避免这种情况吗?我已经看到很多关于 VLC 播放器禁用硬件加速的建议。它已经在 pygame 中被禁用。我在 Windows10 64 位上工作。import avimport pygameimport timecontainer = av.open('video.mp4') # libx264 en-/decoded, pixel format yuv420pcontainer.streams.video[0].thread_type = 'AUTO'frameSequence = container.decode(video=0)for _ in range(100):    image = next(frameSequence) #skip some framespygame.init()trueResolution = pygame.display.list_modes()[0]  # corresponds to video, as it FULL HD                                                 #also tested with HDpygame.display.set_mode(trueResolution)ovl = pygame.Overlay(pygame.YV12_OVERLAY,trueResolution)ovl.display((image.planes[0], image.planes[1], image.planes[2]))time.sleep(10)我还尝试用其他行替换每个平面中的第一行,以检查图像是否已损坏。结果是一样的,所以图像似乎是正确的。UPD1。视频链接https://drive.google.com/file/d/1t6d5weBVeW4EWzGI1gytmUBwXF91dNC9/view?usp=sharing图片上方带有绿线的屏幕截图
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

您可以缩小到屏幕大小并更改覆盖的位置以隐藏绿色条。我知道这不是解决办法,但您可能会发现它足以进一步取得进展。


Overlay 的文档确实警告:


Overlay 对象代表对显示硬件的较低级别访问。要使用该对象,您必须了解视频叠加的技术细节。


因此,具有更多领域专业知识的人可能能够提供更好的解决方案。


pygame.display.set_mode((1280,  718), pygame.RESIZABLE)

ovl = pygame.Overlay(pygame.YV12_OVERLAY,trueResolution)

ovl.set_location(pygame.Rect(0,-2,1280, 720))

注意还trueResolution应该从源流而不是显卡支持的全屏模式来确定。


另外,image在这种情况下是VideoFrame,你可以使用它的.to_image()方法来转换为PIL类型的图像或者.to_rgb(),如果你不想/需要使用的覆盖,这可能是更容易显示。


查看完整回答
反对 回复 2021-09-11
  • 1 回答
  • 0 关注
  • 394 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信