Monotouch AvassetReader
-
30-10-2019 - |
質問
サンプルをObjective CからMonotouchに変換しようとしていますが、いくつかの困難に遭遇しました。
基本的に、ビデオファイルを読み、フレームを1つずつオープンテクスチャにデコードしたいと思います。
これを行うための鍵はAvassetReaderを使用することですが、Monotouchでこれを適切にセットアップする方法がわかりません。
これは私のコードです:
AVUrlAsset asset=new AVUrlAsset(NSUrl.FromFilename(videoFileName),null);
assetReader=new AVAssetReader(asset,System.IntPtr.Zero);
AVAssetTrack videoTrack=asset.Tracks[0];
NSDictionary videoSettings=new NSDictionary();
NSString key = CVPixelBuffer.PixelFormatTypeKey;
NSNumber val=0x754b9d0; //NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; - Had to hardcode constant as it is not defined in Monotouch?
videoSettings.SetNativeField(key,val);
//**The program crashes here:
AVAssetReaderTrackOutput trackOutput=new AVAssetReaderTrackOutput(videoTrack,videoSettings);
assetReader.AddOutput(trackOutput);
assetReader.StartReading();
プログラムは、NSDictionaryのコンテンツが正しい形式ではないことを示す無効な引数例外で、上記の行でクラッシュしますか?ビデオファイルをチェックしましたが、「Asset」にはビデオに関する有効な情報が含まれています。
これが元の客観的なCコードです:
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
AVAssetReaderTrackOutput *trackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoTrack outputSettings:videoSettings];
[_assetReader addOutput:trackOutput];
[_assetReader startReading];
私は客観的なcにはそれではないので、どんな助けも感謝しています。
編集:以下に提案するコードを使用しました
var videoSettings = NSDictionary.FromObjectAndKey (
new NSNumber ((int) MonoTouch.CoreVideo.CVPixelFormatType.CV32BGRA),
MonoTouch.CoreVideo.CVPixelBuffer.PixelFormatTypeKey);
そして、プログラムはもはやクラッシュしません。次のコードを使用することにより、
CMSampleBuffer buffer=assetReader.Outputs[0].CopyNextSampleBuffer();
CVImageBuffer imageBuffer = buffer.GetImageBuffer();
ビデオファイルに次のフレームを含める必要がある画像バッファーを取得します。 ImageBufferオブジェクトを検査することにより、ビデオファイルの幅と一致する幅や高さなどの有効なデータがあることがわかります。
ただし、ImageBuffer BaseadDressは常に0です。これは、画像にデータがないことを示していますか?私はこれをテストとしてやろうとしました:
CVPixelBuffer buffer=(CVPixelBuffer)imageBuffer;
CIImage image=CIImage.FromImageBuffer(buffer);
画像は常にnullとして返されます。これは、実際の画像データが存在しないことを意味し、私のImageBufferオブジェクトにはフレームヘッダー情報のみが含まれていますか?
もしそうなら、これはMonotouchのバグですか、それとも私はこれを間違っているのですか?
画像データが準備が整うのを待つ必要があるかもしれないという考えがありましたが、その場合、どのようにわかりません。かなり立ち往生しています...
正しい解決策はありません