2017-06-23 14 views
0

は私がCVPixelBufferRefの配列を作成して再利用するには?私のアプリケーションで

  1. へのMP4ムービーを書き込むためのカスタムオーダーにAVAssetWriterInputPixelBufferAdaptorにそれらを後で追加24 CVPixelBufferRef
  2. を作成する必要があります。

VideoExport :: ADDFRAME関数は次の空CVPixelBufferRef生画素データと格納を受信します。デモコードは次のとおりです。

// .h 
CVPixelBufferRef buffers[24]; 

// .mm 
void VideoExport::addFrame(unsigned char * pixels, long frame_index) { 
    buffers[frame_index] = NULL; 
    CVPixelBufferCreateWithBytes(NULL, 
          frameSize.width, 
          frameSize.height, 
          kCVPixelFormatType_24RGB, 
          (void*)pixels, 
          frameSize.width * 3, 
          NULL, 
          0, 
          NULL, 
          &buffers[frame_index]); 
} 

ピクセルバッファが正常に表示されないようです。問題は、をbuffers[index]に変更して別のフレームをムービーファイルに書き込もうとすると、同じフレームが再び上書きされることです。

保存されたフレームは、私がaddFrameに送った最後のものと思われ、ユニークなバッファの配列を使用しようとしています。私はaddFrameへの呼び出しが以前のデータを上書きすると思われます。

注1:addFrameに送信されたピクセルが一意であることをテストしました。

注2:addFrameのすぐ内側のフレームにフレームを追加すると、生成されたムービーに固有のフレームがありますが、フレームオーダーをシャッフルできません。

の配列を作成して再利用する正しい方法は何ですか?CVPixelBufferRefpixelBufferPoolが役に立ったら、どうすればいいですか?

ありがとうございます。

答えて

0

問題を見つけました。

私のaddFrameでは、すべてのaddFrame呼び出しの後にunsigned char * pixelsが破壊されました。しかし、後でbuffersアレイを使用可能にするには、アレイが破棄されるまでピクセルを有効にしておく必要があります(buffers)。

関連する問題