缓冲长度gstreamer不正确

时间:2013-11-04 15:22:12

标签: pygame gstreamer python-gstreamer

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

1 个答案:

答案 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)

瞧,即使格式错误的缓冲区出现在​​屏幕上也没有问题

相关问题