public void GenerateCGImagesAsynchronously() { // This test deadlocks on Mountain Lion (but works on Lion) // https://gist.github.com/rolfbjarne/1190d97af79e554c298f2c133dfd8e87 TestRuntime.AssertSystemVersion(ApplePlatform.MacOSX, 10, 9, throwIfOtherPlatform: false); handled = false; mre = new ManualResetEvent(false); ThreadStart main = () => { using (NSUrl video_url = NSUrl.FromFilename(video_asset_path)) using (AVAsset video_asset = AVAsset.FromUrl(video_url)) using (AVAssetImageGenerator aig = new AVAssetImageGenerator(video_asset)) { NSValue[] values = new NSValue[] { NSValue.FromCMTime(CMTime.Zero) }; aig.GenerateCGImagesAsynchronously(values, handler); mre.WaitOne(); } }; var thread = new Thread(main) { IsBackground = true, }; thread.Start(); Assert.True(mre.WaitOne(2000), "wait"); Assert.True(handled, "handled"); }
void HandleVideo(MediaFile file) { if (file == null) { return; } var mediaUrl = file.Path; var documentsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var outputFile = Path.Combine(documentsDirectory, Guid.NewGuid().ToString() + ".mp4"); AVUrlAsset asset = new AVUrlAsset(NSUrl.CreateFileUrl(new string[] { mediaUrl })); AVAssetExportSession exportSession = new AVAssetExportSession(asset, AVAssetExportSession.Preset1280x720); var fileUrl = NSUrl.CreateFileUrl(new string[] { outputFile }); exportSession.OutputUrl = NSUrl.CreateFileUrl(new string[] { outputFile }); exportSession.OutputFileType = AVFileType.Mpeg4; LoadingScreen.Show(); LoadingScreen.SetText("Converting"); exportSession.ExportAsynchronously(() => { InvokeOnMainThread(() => { if (exportSession.Error != null) { int i = 3; } AVUrlAsset asset2 = new AVUrlAsset(NSUrl.CreateFileUrl(new string[] { mediaUrl })); AVAssetImageGenerator generator = new AVAssetImageGenerator(asset2); generator.AppliesPreferredTrackTransform = true; var thumbTime = new CMTime(0, 30); NSValue[] vals = new NSValue[] { NSValue.FromCMTime(thumbTime) }; CGSize maxSize = new CGSize(800, 600); //generator.MaximumSize = maxSize; generator.GenerateCGImagesAsynchronously(vals, (requestedTime, imageRef, actualTime, result, error) => { var previewImage = System.IO.Path.Combine(documentsDirectory, Guid.NewGuid() + ".jpg"); NSError err; UIImage.FromImage(new CGImage(imageRef)).AsJPEG(.75f).Save(previewImage, false, out err); InvokeOnMainThread(() => { LoadingScreen.Hide(); VideoPicked?.Invoke(outputFile, previewImage); }); }); }); }); }
public void GenerateCGImagesAsynchronously_Compat() { handled = false; mre = new ManualResetEvent(false); ThreadStart main = () => { using (NSUrl video_url = NSUrl.FromFilename(video_asset_path)) using (AVAsset video_asset = AVAsset.FromUrl(video_url)) using (AVAssetImageGenerator aig = new AVAssetImageGenerator(video_asset)) { aig.GenerateCGImagesAsynchronously(NSValue.FromCMTime(CMTime.Zero), handler); mre.WaitOne(); } }; var asyncResult = main.BeginInvoke(null, null); main.EndInvoke(asyncResult); Assert.True(mre.WaitOne(2000)); Assert.True(handled, "handled"); }