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);
                        });
                    });
                });
            });
        }
예제 #3
0
        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");
        }