0

我有以下函数处理包含 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 会崩溃,因为提供的缓冲区大于所需的大小,并且此大小需要匹配。我知道这可能是由于播放的电影编码错误(因为大多数电影运行良好),但有没有办法解决这种意外情况?有没有办法将缓冲区的大小调整为正确的大小?我试图以所需的长度切断缓冲区的尾部,然后播放电影,但输出已损坏。

4

1 回答 1

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)

瞧,即使是格式不正确的缓冲区也可以毫无问题地出现在屏幕上

于 2013-12-16T14:51:56.537 回答