コード例 #1
0
        public Task Encode(string originalFile, string outputFile, int start, int end,
                           IProgress <EncodeProgress> encodeProgresss,
                           CancellationToken cancelToken)
        {
            var taskCompletionSource = new TaskCompletionSource <bool>();

            var instance = new HandBrakeInstance();

            instance.Initialize(1);

            instance.ScanCompleted += (o, args) =>
            {
                try
                {
                    if (start >= end)
                    {
                        throw new Exception("Invalid start and end times.");
                    }
                    var sourceTitle = instance.Titles.TitleList.FirstOrDefault();
                    if (sourceTitle == null)
                    {
                        throw new Exception("Could not read input video.");
                    }

                    var settings = GetDefaultSettings();
                    settings.Destination.File = outputFile;
                    dynamic resolution = settings.Filters.FilterList.First(filter => filter.ID == 11).Settings;

                    resolution.width            = sourceTitle.Geometry.Width;
                    resolution.height           = sourceTitle.Geometry.Height;
                    settings.Source.Range.Start = start * 90000;
                    settings.Source.Range.End   = end * 90000;

                    settings.Source.Path = originalFile;

                    cancelToken.Register(() => instance.StopEncode());

                    instance.StartEncode(settings);
                }
                catch (Exception e)
                {
                    taskCompletionSource.TrySetException(e);
                }
            };

            instance.EncodeProgress += (o, args) => NewMeth(args, encodeProgresss);

            instance.EncodeCompleted += (o, args) =>
            {
                try
                {
                    if (args.Error)
                    {
                        if (cancelToken.IsCancellationRequested)
                        {
                            throw new Exception("Encoding was canceled");
                        }
                        throw new Exception("Encoding failed. I don't know why 'cause this API kinda sucks");
                    }
                    taskCompletionSource.TrySetResult(true);
                }
                catch (Exception e)
                {
                    taskCompletionSource.TrySetException(e);
                }
            };

            instance.StartScan(originalFile, 1, TimeSpan.Zero, 1);

            return(taskCompletionSource.Task);
        }