Ejemplo n.º 1
0
        public async Task openAndPlay(string location,
                                      string inputFormatName = null, string audioLocation            = null,
                                      string audioFormatName = null, List <String> subtitleLocations = null)
        {
            try
            {
                // cancel any previously running open operation
                CancellationTokenSource prevCancelTokenSource = CancelTokenSource;
                Task prevOpenTask = OpenTask;

                CancellationTokenSource newCancelTokenSource = new CancellationTokenSource();
                CancelTokenSource = newCancelTokenSource;

                await close(prevCancelTokenSource, prevOpenTask);

                // open video
                newCancelTokenSource.Token.ThrowIfCancellationRequested();

                VideoLocation = location;

                OpenVideoArgs args = new OpenVideoArgs(location, inputFormatName, audioLocation, audioFormatName);

                OpenTask = Task.Factory.StartNew(() => videoDecoder.open(args, DecodedVideoFormat, newCancelTokenSource.Token), newCancelTokenSource.Token);
                await OpenTask;

                if (videoDecoder.HasVideo)
                {
                    videoRender.initialize(videoDecoder.Width, videoDecoder.Height);

                    Subtitles.clear();
                    Subtitles.findMatchingSubtitleFiles(location);

                    if (subtitleLocations != null)
                    {
                        foreach (String subtitleLocation in subtitleLocations)
                        {
                            Subtitles.addSubtitleFile(subtitleLocation);
                        }
                    }

                    Subtitles.Track = 0;
                }

                DurationSeconds = videoDecoder.DurationSeconds;
                HasAudio        = videoDecoder.HasAudio;

                previousVideoPts   = 0;
                previousVideoDelay = 0.04;
                audioDiffAvgCount  = 0;

                if (videoDecoder.HasAudio)
                {
                    audioPlayer.initialize(videoDecoder.SamplesPerSecond, videoDecoder.BytesPerSample,
                                           Math.Min(videoDecoder.NrChannels, 2), videoDecoder.MaxAudioFrameSize * 2);

                    audioDiffThreshold = 2.0 * 1024 / videoDecoder.SamplesPerSecond;
                }

                VideoState = VideoState.OPEN;

                play();
            }
            catch (VideoLib.VideoLibException)
            {
                VideoState = VideoState.CLOSED;

                //log.Error("Cannot open: " + location, e);

                throw;
            }
        }