首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单点触控AVAssetReader

单点触控AVAssetReader
EN

Stack Overflow用户
提问于 2012-01-19 17:01:15
回答 2查看 793关注 0票数 1

我正在尝试将一个样本从objective C转换到Monotouch,但我遇到了一些困难。

基本上,我想读取一个视频文件,然后将帧逐个解码为opengl纹理。

做到这一点的关键是使用AVAssetReader,但我不确定如何在Monotouch中正确设置它。

这是我的代码:

代码语言:javascript
复制
    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代码:

代码语言:javascript
复制
                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不是很感兴趣,所以任何帮助都是非常感谢的。

编辑:我使用了下面建议的代码

代码语言:javascript
复制
var videoSettings = NSDictionary.FromObjectAndKey (
  new NSNumber ((int) MonoTouch.CoreVideo.CVPixelFormatType.CV32BGRA),
  MonoTouch.CoreVideo.CVPixelBuffer.PixelFormatTypeKey);

程序也不会再崩溃。通过使用以下代码:

代码语言:javascript
复制
        CMSampleBuffer buffer=assetReader.Outputs[0].CopyNextSampleBuffer();
        CVImageBuffer imageBuffer = buffer.GetImageBuffer();

我得到了图像缓冲区,它应该包含视频文件中的下一帧。通过检查imageBuffer对象,我发现它具有有效的数据,如宽度和高度,与视频文件的数据相匹配。

但是,imageBuffer BaseAddress始终为0,这表示镜像没有数据?我试着这样做作为一个测试:

代码语言:javascript
复制
        CVPixelBuffer buffer=(CVPixelBuffer)imageBuffer;
        CIImage image=CIImage.FromImageBuffer(buffer);

并且image总是作为null返回。这是否意味着实际的图像数据不存在,并且我的imageBuffer对象只包含帧头信息?

如果是这样的话,这是Monotouch中的一个bug,还是我设置错了?

我有一个想法,我可能需要等待图像数据准备好,但在这种情况下,我也不知道如何做。现在被卡住了..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-20 09:37:21

您需要像这样创建NSDictionary:

代码语言:javascript
复制
var videoSettings = NSDictionary.FromObjectAndKey (
  new NSNumber ((int) MonoTouch.CoreVideo.CVPixelFormatType.CV32BGRA),
  MonoTouch.CoreVideo.CVPixelBuffer.PixelFormatTypeKey);

SetNativeField则完全不同(将名为CVPixelBuffer.PixelFormatTypeKey的字段设置为0x754b9d0,而不是将键/值对添加到字典中)。

票数 3
EN

Stack Overflow用户

发布于 2012-01-19 21:12:26

NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA;-必须硬编码常量,因为它没有在中定义?

您应该能够将其替换为:

代码语言:javascript
复制
CVPixelFormatType.CV32BGRA

请注意,MonoTouch将此值定义为0x42475241,这与您的不同。这可能是你的错误。如果没有,我建议你做一个小的,自包含的测试用例,并将其附加到http://bugzilla.xamarin.com上的错误报告中,我们将对其进行研究。

一个到objective-c示例的链接(如果有)也会很有帮助(在这里可以更新您的问题或bug报告)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8923386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档