2011-10-25 25 views
5

CVPixelBufferRefにデータを読み込むためにglReadPixelsを使用しています。私はCVPixelBufferRefを入力としてAVAssetWriterに入力します。残念ながら、ピクセルフォーマットは不一致であるようです。ピクセルフォーマット、CVPixelBufferRefs、glReadPixels

私はAVAssetWriterARGBフォーマットの画素データを望んでいる間glReadPixelsRGBA形式でピクセルデータを返していると思います。変換する最良の方法は何ですかRGBAARGB?ここで

は、私がこれまで試したものです:ARGB =(RGBA >> 8)の線に沿って

  • ビット操作を|中間ステップ

CVPixelBufferRefは添え字をサポートしていないようですので、ビット操作が機能しなかったとしてCGImageRefを用いて(RGBA < < 24)

  • CGImageRef中間ステップは機能しますが、パフォーマンスが低下する可能性があるコードを50行追加したくないと思います。

  • +2

    どのようにCVPixelBufferRefを取得していますか?あなたはCVPixelBufferCreateを呼び出していますか?もしそうなら、あなたはpixelFormatTypeパラメータとして何を渡していますか?どの形式がglReadPixelsに渡されますか? –

    +0

    'kCVPixelFormatType_32ARGB'を' CVPixelBufferCreate'に渡しています。 glReadPixelsに 'GL_RBGA'を渡します。私は 'CVPixelBufferCreate'にRBGAフォーマットを渡そうとしましたが、動作しませんでした(悪い色かアプリがクラッシュしました)。 – MrDatabase

    答えて

    6

    ベターあなたがイメージをレンダリングするときのGPU

    そして最も良い方法は、iOS5 CoreVideo CVOpenGLESTextureCacheを使用してCVPixelBufferRefに直接描画し、glReadPixelsの呼び出しを削除して、コピーステージを完全に削除することです。

    p.s.私はAVAssetWriterがBGRA形式のデータを望んでいると確信しています(実際にはyuvでそれを望むかもしれませんが、それは別の話です)。

    UPDATE:リンク用として、DOCOはまだNDA下のようですが、利用できる自由にダウンロード可能なサンプルコードの2枚あります。

    GLCameraRippleRosyWriter

    はヘッダが良いドキュメントが含まれているファイル自体を、 Macの同等機能は非常によく似ているので(CVOpenGLTextureCache)、始めるには十分なはずです。

    +0

    ' OpenGLTextureCache'は素晴らしいです。関連するドキュメントへのリンクがありますか? – MrDatabase

    +1

    ADCログインがあればドキュメントを入手できます。コード –

    +0

    にお答えしています。本当に面白いですね!ありがとう:-) – MrDatabase

    2

    それは暗闇の中でショットのようなものだが、あなたはCVPixelBufferCreateためkCVPixelFormatType_32BGRAglReadPixelsためGL_BGRAを試してみましたか?

    Technical Q&A QA1501には、サポートされているRGBA形式がリストされていないため、この提案があります。

    +0

    残念ながらGL_BGRAを 'glReadPixels'に渡すと、出力ピクセルデータはすべて0になります:-( – MrDatabase

    6

    ビット操作について、あなたはピクセルバッファの生データへのポインタを取得することができます:コンポーネントを交換するためにCPUを使用して効率的にそれを行う簡単なフラグメントシェーダを書くことであるより

    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); 
    
    1

    glReadPixels(0、0、w * s、h * s、GL_BGRA、GL_UNSIGNED_BYTE、buffer);

    glReadPixelsでGL_BGRAを使用します。 それは動作し、ちょうどそれ自身を試みた。

    +0

    ゼロ以外のデータ出力バッファに? – MrDatabase

    +0

    GL_BGRAは、OpenGLエラーのロードを作成します。 – emrahgunduz

    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); 
    
    関連する問題