Я пытаюсь преобразовать образец из объектива C в Monotouch, и у меня возникли некоторые трудности.Monotouch AVAssetReader
В принципе, я хочу прочитать видеофайл и декодировать кадры по одному на текстуру 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 не в нужном формате? Я проверил видеофайл, и он загружается хорошо, «актив» содержит достоверную информацию о видео.
Это оригинальный код 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];
Я не то, что в Objective C, поэтому любая помощь приветствуется.
EDIT: Я использовал код не предложил ниже
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, я обнаружил, что он имеет допустимые данные, такие как ширина и высота, соответствующие данным видеофайла.
Однако, BaseBuder BaseBader всегда 0, что означает, что изображение не имеет данных? Я попытался сделать это как тест:
CVPixelBuffer buffer=(CVPixelBuffer)imageBuffer;
CIImage image=CIImage.FromImageBuffer(buffer);
И изображение всегда возвращается как null. Означает ли это, что фактические данные изображения отсутствуют, а мой объект imageBuffer содержит только информацию заголовка кадра?
И если да, это ошибка в Monotouch, или я устанавливаю это неправильно?
У меня возникла идея, что мне может потребоваться, чтобы данные изображения были готовы, но в этом случае я тоже не знаю. Довольно застрял сейчас ...