我正在尝试将一个样本从objective C转换到Monotouch,但我遇到了一些困难。
基本上,我想读取一个视频文件,然后将帧逐个解码为opengl纹理。
做到这一点的关键是使用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“包含有关视频的有效信息。
这是原始的Objective 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);并且image总是作为null返回。这是否意味着实际的图像数据不存在,并且我的imageBuffer对象只包含帧头信息?
如果是这样的话,这是Monotouch中的一个bug,还是我设置错了?
我有一个想法,我可能需要等待图像数据准备好,但在这种情况下,我也不知道如何做。现在被卡住了..。
发布于 2012-01-20 09:37:21
您需要像这样创建NSDictionary:
var videoSettings = NSDictionary.FromObjectAndKey (
new NSNumber ((int) MonoTouch.CoreVideo.CVPixelFormatType.CV32BGRA),
MonoTouch.CoreVideo.CVPixelBuffer.PixelFormatTypeKey);SetNativeField则完全不同(将名为CVPixelBuffer.PixelFormatTypeKey的字段设置为0x754b9d0,而不是将键/值对添加到字典中)。
发布于 2012-01-19 21:12:26
NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA;-必须硬编码常量,因为它没有在中定义?
您应该能够将其替换为:
CVPixelFormatType.CV32BGRA请注意,MonoTouch将此值定义为0x42475241,这与您的不同。这可能是你的错误。如果没有,我建议你做一个小的,自包含的测试用例,并将其附加到http://bugzilla.xamarin.com上的错误报告中,我们将对其进行研究。
一个到objective-c示例的链接(如果有)也会很有帮助(在这里可以更新您的问题或bug报告)。
https://stackoverflow.com/questions/8923386
复制相似问题