2016-08-30 16 views
1

.h264ビデオをOpenGLにデコードしようとしましたが、表示されるフレームは黒です。エラーは表示されません。フレームをCMSampleBufferRefからカメラロールにエクスポートすると、正常に動作します。iOS - OpenGL ES 2.0でのビデオデコード

その後、OpenGLの側に多分ですか?しかし、私は画像ではなくビデオを表示するとき、それはうまく動作するので、どこを見るか分からない。ここ

は、ビデオデコーダを初期化するためのコードである:

- (void)initVideo { 

    glActiveTexture(GL_TEXTURE0); 
    glGenTextures(1, &_glTextureHook); 

    NSURL * url = [NSURL URLWithString:[self.videoMedia getFilePath]]; 
    self.videoAsset = [[AVURLAsset alloc] initWithURL:url options:NULL]; 

    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

    [self.videoAsset loadValuesAsynchronouslyForKeys:@[@"tracks"] completionHandler:^{ 

     self.videoTrack = [self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0]; 

     NSString *key = (NSString *) kCVPixelBufferPixelFormatTypeKey; 
     NSNumber *value = @(kCVPixelFormatType_32BGRA); 
     NSDictionary *settings = @{key : value}; 

     self.outputVideoTrackOuput = [[AVAssetReaderTrackOutput alloc] 
             initWithTrack:self.videoTrack outputSettings:settings]; 

     self.assetReader = [[AVAssetReader alloc] initWithAsset:self.videoAsset error:nil]; 
     [self.assetReader addOutput:self.outputVideoTrackOuput]; 
     [self.assetReader startReading]; 

     dispatch_semaphore_signal(sema); 
    }]; 

    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
} 

およびOpenGLテクスチャを取得するためのコード、ビデオの各フレーム:

- (void)play { 

    if (self.assetReader.status == AVAssetReaderStatusReading) { 
     CMSampleBufferRef sampleBuffer = [self.outputVideoTrackOuput copyNextSampleBuffer]; 
     if(sampleBuffer) { 
      CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

      if(pixelBuffer) { 
       CVPixelBufferLockBaseAddress(pixelBuffer, 0); 

       glBindTexture(GL_TEXTURE_2D, _glTextureHook); 
       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(pixelBuffer)); 
       CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 
      } 

      CFRelease(sampleBuffer); 
     } 
    } 
} 

頂点シェーダ及びフラグメントであります画像とビデオ(画像で動作する)についても同じです。私が見る唯一の違いはglTexImage2Dです。両方のフォーマットは画像のGL_RGBAです。

私は、コンテキストがスレッド上で起動されたビデオデコーダの_glTextureHookはよくシェーダマネージャに送信されていることを確認しましたなど

これは、フラグメントシェーダのコード(それは頂点に同じ、非常に基本的ですですシェーダ):

precision lowp float; 

uniform sampler2D Texture; 

varying vec4 DestinationColor; 
varying vec2 TexCoordOut; 

void main() { 
    gl_FragColor = DestinationColor * texture2D(Texture, TexCoordOut); 
} 
+0

をあなたが正常に成功したのOpenGLの下のiOSビデオを再生するのですか?はいの場合はコードを共有してもよろしいですか?事前にありがとう! – loki

+0

コードのおかげで、私はこれの具体的な例を数日間探してきました。 @ロキのように、あなたは何か成功しましたか?あなたはいつでもオーディオを関わっていましたか? –

答えて

0

私はテクスチャを作成した後、それらの行を逃した:

glBindTexture(GL_TEXTURE_2D, _glTextureHook); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
関連する問題