7

glReadPixelsにデータを読み込むために使用していCVPixelBufferRefます。CVPixelBufferRefへの入力としてを使用しAVAssetWriterます。残念ながら、ピクセル形式が一致していないようです。

ARGB形式のピクセルデータが必要なときに、 RGBA形式glReadPixelsのピクセルデータを返すと思います。RGBAARGBに変換する最良の方法は何ですか?AVAssetWriter

これが私がこれまでに試したことです:

  • argb = (rgba >> 8) | 行に沿ったビット操作。(rgba << 24)
  • CGImageRefaを中間ステップとして使用する

CVPixelBufferRef が添え字をサポートしていないように見えるため、ビット操作は機能しませんでした。中間ステップは機能しますCGImageRefが、パフォーマンスに影響を与える可能性のある余分な 50 行のコードは避けたいと思います。

4

5 に答える 5

7

ビット操作に関しては、ピクセルバッファの生データへのポインタを取得できます。

CVPixelBufferLockBaseAddress(buffer, 0);
size_t stride = CVPixelBufferGetBytesPerRow(buffer);
char *data = (char *)CVPixelBufferGetBaseAddress(buffer);
for (size_t y = 0; y < CVPixelBufferGetHeight(buffer); ++y) {
    uint32_t *pixels = (uint32_t *)(data + stride * y);
    for (size_t x = 0; x < CVPixelBufferGetWidth(buffer); ++x)
        pixels[x] = (pixels[x] >> 8) | (pixels[x] << 24);
}
CVPixelBufferUnlockBaseAddress(buffer, 0);
于 2011-10-25T22:58:58.253 に答える
7

CPU を使用してコンポーネントを交換するよりも、単純なフラグメント シェーダーを記述して、画像をレンダリングするときに GPU で効率的に交換する方がよいでしょう。

最善の方法は、iOS5 CoreVideo CVOpenGLESTextureCache を使用してコピー ステージを完全に削除することです。これにより、CVPixelBufferRef に直接レンダリングできるようになり、glReadPixels の呼び出しが不要になります。

ps AVAssetWriter は BGRA 形式のデータを必要としていると確信しています (実際にはおそらく yuv で必要ですが、それは別の話です)。

更新: リンクに関しては、ドコはまだ NDA の下にあるようですが、無料でダウンロード可能なサンプル コードが 2 つ利用可能です。

GLCameraRippleRosyWriter

ヘッダー ファイル自体には適切なドキュメントが含まれており、Mac 版も非常によく似ています (CVOpenGLTextureCache)。

于 2011-10-26T11:38:56.207 に答える
2

GL_BGRA暗闇でのショットのようなものですが、 forglReadPixelskCVPixelFormatType_32BGRAforを試しましたCVPixelBufferCreateか?

Technical Q&A QA1501には、サポートされている RGBA 形式が記載されていないため、これをお勧めします。

于 2011-10-25T22:35:52.660 に答える
1
    glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, _buffer);
    CVPixelBufferRef buffer = NULL;
    CVReturn ret = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,_size.width,_size.height,kCVPixelFormatType_32BGRA,glubyte,_size.width*4,NULL,NULL,NULL,&buffer);
于 2012-12-21T20:59:36.837 に答える
1

glReadPixels(0, 0, w*s, h*s, GL_BGRA, GL_UNSIGNED_BYTE, バッファ);

glReadPixels で GL_BGRA を使用します。動作します。自分で試してみました。

于 2011-11-12T00:06:40.600 に答える