7

iOSでビデオ(MP4 / H.263)を再生しようとしていますが、結果が非​​常にぼやけています。アセットの読み取りを初期化するコードは次のとおりです。

mTextureHandle = [self createTexture:CGSizeMake(400,400)];

NSURL * url = [NSURL fileURLWithPath:file];    
mAsset = [[AVURLAsset alloc] initWithURL:url options:NULL];

NSArray * tracks = [mAsset tracksWithMediaType:AVMediaTypeVideo];

mTrack = [tracks objectAtIndex:0];

NSLog(@"Tracks: %i", [tracks count]);

NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary * settings = [[NSDictionary alloc] initWithObjectsAndKeys:value, key, nil];

mOutput = [[AVAssetReaderTrackOutput alloc] 
            initWithTrack:mTrack outputSettings:settings];


mReader = [[AVAssetReader alloc] initWithAsset:mAsset error:nil];
[mReader addOutput:mOutput];

読者の初期化についてはこれだけですが、実際のテクスチャリングは次のとおりです。

CMSampleBufferRef sampleBuffer = [mOutput copyNextSampleBuffer];    
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

glBindTexture(GL_TEXTURE_2D, mTextureHandle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 600, 400, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress( pixelBuffer ));    
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );    
CFRelease(sampleBuffer);

レンダリングされた画像が次のようになることを除いて、すべてがうまく機能します。スライスして歪んだ?

ここに画像の説明を入力してください

AVAssetTrack常にを返すので、無駄に、の優先変換行列を調べてみましたCGAffineTransformIdentity

補足:ソースをカメラに切り替えると、画像はきれいにレンダリングされます。解凍手順がありませんか?それはアセットリーダーによって処理されるべきではありませんか?

ありがとう!

コード:https ://github.com/shaded-enmity/objcpp-opengl-video

4

1 に答える 1

6

CMSampleBuffer はパフォーマンス上の理由からパディングを使用していると思うので、テクスチャに適切な幅が必要です。

テクスチャの幅を次のように設定してみてください: CVPixelBufferGetBytesPerRow(pixelBuffer) / 4 (ビデオ形式がピクセルあたり 4 バイトを使用している場合、それ以外の場合は変更します)

于 2011-10-01T13:44:36.927 に答える