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