2013-08-22 3 views
0

Я пробую очень простую программу: загрузите видео ресурса с помощью AVFoundation и получите байты видеофрагмента как текстуры OpenGL.InvalidCastException внутри AVFoundation MonoTouch.AVAsset.FromUrl

Общий поток довольно проста:

  • я загрузить видео в AVAsset
  • Тогда я получаю видео дорожки в AVAssetReaderTrackOutput
  • я подключить его в AVAssetReader
  • я начинаю
  • И для каждого видеокадра я получаю CMSampleBuffer, из которого я получаю CVPixelBuffer.
  • я затем заблокировать CVPixelBuffer и загрузить это в OpenGL с GL.TexImage2D

Она работает довольно хорошо в эмуляторе, но когда я пытаюсь его в реальном устройстве, я получаю следующее сообщение об ошибке в первой шаг:

System.InvalidCastException: Cannot cast from source type to destination type. 
    at MonoTouch.AVFoundation.AVAsset.FromUrl (MonoTouch.Foundation.NSUrl url) [0x00011] in /Developer/MonoTouch/Source/monotouch/src/AVFoundation/AVAsset.g.cs:231 
    at MyTestApp.EAGLView.LoadVideo() [0x00033] in /Volumes/Shared/MyTestApp/MyTestApp/EAGLView.cs:191 

код, который бросает исключение идет как:

private AVAsset videoAsset; 
private AVAssetReaderTrackOutput videoReaderOutput; 
private AVAssetReader videoReader; 

private void LoadVideo() 
{ 
    var videoPath = NSBundle.MainBundle.PathForResource("video", "mp4"); 
    var videoURL = NSUrl.FromFilename(videoPath); 
    Console.WriteLine ("Loading from " + videoURL.ToString()); 
    object videoAssetRaw = AVAsset.FromUrl(videoURL); // Exception thrown here 
    videoAsset = videoAssetRaw as AVAsset; 
    var tracks = videoAsset.Tracks; 
    NSError error; 
    AVAssetTrack videoTrack = tracks[0]; 

    AVVideoSettings settings = new AVVideoSettings(); 
    settings.PixelFormat = CVPixelFormatType.CV32BGRA; 

    videoReaderOutput = AVAssetReaderTrackOutput.FromTrack(videoTrack, settings.ToDictionary()); 
    videoReader = new AVAssetReader (videoAsset, out error); 
    videoReader.AddOutput (videoReaderOutput); 
    videoReader.StartReading(); 
} 

Я получил его в object, а не AVAsset, просто чтобы убедиться, что InvalidCastException не выбрасывается с моей стороны, но, как видно из исключения, он перебрасывается по строке 231 из AVAsset.g.cs, чего у меня нет.

Видеофайл строится как «BundleResource», и я использую последнюю версию xamarin (скачанную ранее сегодня).

Любые идеи о том, что может быть причиной этого?

+0

Вы можете проверить существование файла (на устройстве)? перед вызовом 'Assert.FromUrl'. – poupou

+0

@poupou Это должно подождать до завтра. Однако, если файл не был там, не должен ли я получать «FileNotFoundException» или, по крайней мере, какой-то «IOExcepton»? –

+0

Нет, вы вызываете ** родной ** код, чтобы вы не получали из него управляемое исключение. В общем, Apple API возвращает «null» в таком состоянии. Если файл существует, я предлагаю вам записать отчет об ошибке (с автономным тестовым примером), чтобы мы могли изучить его (и посмотреть, что возвращается, это означает, что это не подкласс AVAset, как задокументировано). – poupou

ответ

0

Как насчет вместо ...

object videoAssetRaw = AVAsset.FromUrl(videoURL); 

Try ...

AVUrlAssetOptions options = null; 
var asset = new AVUrlAsset (url, options); 
Смежные вопросы