私は非常に単純なプログラムを試しています: AVFoundation を使用してリソース ビデオを読み込み、ビデオ フレーム バイトを OpenGL テクスチャとして取得します。
一般的な流れは非常に簡単です。
- ビデオを
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
はなく に入れましたが、例外が読み取られるように、 の 231 行目でスローされていますが、これはありません。AVAsset
InvalidCastException
AVAsset.g.cs
ビデオ ファイルは "BundleResource" としてビルドされており、最新バージョンの xamarin (本日ダウンロード済み) を使用しています。
これを引き起こしている可能性のあるアイデアはありますか?