.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);
}
をあなたが正常に成功したのOpenGLの下のiOSビデオを再生するのですか?はいの場合はコードを共有してもよろしいですか?事前にありがとう! – loki
コードのおかげで、私はこれの具体的な例を数日間探してきました。 @ロキのように、あなたは何か成功しましたか?あなたはいつでもオーディオを関わっていましたか? –