Я пробую очень простую программу: загрузите видео ресурса с помощью 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 (скачанную ранее сегодня).
Любые идеи о том, что может быть причиной этого?
Вы можете проверить существование файла (на устройстве)? перед вызовом 'Assert.FromUrl'. – poupou
@poupou Это должно подождать до завтра. Однако, если файл не был там, не должен ли я получать «FileNotFoundException» или, по крайней мере, какой-то «IOExcepton»? –
Нет, вы вызываете ** родной ** код, чтобы вы не получали из него управляемое исключение. В общем, Apple API возвращает «null» в таком состоянии. Если файл существует, я предлагаю вам записать отчет об ошибке (с автономным тестовым примером), чтобы мы могли изучить его (и посмотреть, что возвращается, это означает, что это не подкласс AVAset, как задокументировано). – poupou