Monotouch AVAssetReader - PullRequest
       18

Monotouch AVAssetReader

1 голос
/ 19 января 2012

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

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

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Вам нужно создать NSDictionary следующим образом:

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

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

1 голос
/ 19 января 2012

[NSNumber numberWithUnsignedInt: kCVPixelFormatType_32BGRA]; - Пришлось ли жестко закодировать константу, поскольку она не определена в Monotouch?

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

CVPixelFormatType.CV32BGRA

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

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

...