2012-01-19 4 views
1

Я пытаюсь преобразовать образец из объектива 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, или я устанавливаю это неправильно?

У меня возникла идея, что мне может потребоваться, чтобы данные изображения были готовы, но в этом случае я тоже не знаю. Довольно застрял сейчас ...

ответ

3

Вам нужно создать NSDictionary так:

var videoSettings = NSDictionary.FromObjectAndKey (
    new NSNumber ((int) MonoTouch.CoreVideo.CVPixelFormatType.CV32BGRA), 
    MonoTouch.CoreVideo.CVPixelBuffer.PixelFormatTypeKey); 

SetNativeField нечто совсем другое (вы устанавливаете поле с именем CVPixelBuffer.PixelFormatTypeKey в 0x754b9d0, не добавляя ключ/значение пары в словарь).

1

[Номер NSNumberWithUnsignedInt: kCVPixelFormatType_32BGRA]; - Должен ли жесткий код постоянным, поскольку он не определен в Monotouch?

Вы должны быть в состоянии заменить это:

CVPixelFormatType.CV32BGRA 

Обратите внимание, что MonoTouch определяет это значение как 0x42475241, который отличается от вашего. Это может быть вашей ошибкой. Если нет, я предлагаю вам сделать небольшой, самостоятельный тестовый пример и приложить его к отчету об ошибке на http://bugzilla.xamarin.com, и мы рассмотрим его.

Ссылка на образец объектива-c, если он доступен, также будет полезен (здесь, чтобы обновить свой вопрос или отчет об ошибке).