我有以下函数处理包含GStreamer提供的视频帧的缓冲区对象
def __handle_videoframe(self, appsink):
"""
Callback method for handling a video frame
Arguments:
appsink -- the sink to which gst supplies the frame (not used)
"""
buffer = self._videosink.emit('pull-buffer')
(w,h) = buffer.get_caps[0]["width"],buffer.get_caps[0]["height"]
reqBufferLength = w * h * 3 #Required buffer lenght for a raw rgb image of these dimensions
print "Buffer length: " + str(len(buffer.data))
print "Needed length: " + str(reqBufferLength)
img = pygame.image.frombuffer(buffer.data, self.vidsize, "RGB")
self.screen.blit(img, self.vidPos)
pygame.display.flip()
然而,当运行此代码时,pygame崩溃,因为提供的缓冲区大于所需的并且此大小需要匹配。我知道这可能是因为播放的电影编码错误(因为大多数电影运行良好),但有没有办法解释这种偶然性?有没有办法在转到正确的大小时调整缓冲区的大小?我试图以所需的长度切断缓冲区的尾部然后电影播放,但输出已损坏。
答案 0 :(得分:0)
好的,更好的解决方案是使用缓冲区代理。它们对缓冲区的长度不太模糊。
img_sfc = pygame.Surface(video_dimensions, pygame.SWSURFACE, 24, (255, 65280, 16711680, 0))
img_buffer = img_sfc.get_buffer()
然后为每个新框架:
img_buffer.write(buffer.data, 0)
pygame.display.get_surface().blit(img_sfc.copy(), vid_pos)
瞧,即使格式错误的缓冲区出现在屏幕上也没有问题