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

わかりました。より良い解決策は、bufferproxy を使用することでした。それらはバッファの長さについてそれほどあいまいではありません。

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 に答える