Exemple #1
0
        public int Play()
        {
            int ret;

            if (!decoder.isReady || decoder.isRunning || isPlaying)
            {
                return(-1);
            }

            if ((ret = decoder.RunVideo()) != 0)
            {
                return(ret);
            }
            //decoder.RunSubs();

            status = Status.PLAYING;

            if (decoder.hasVideo)
            {
                if (decoder.hasVideo)
                {
                    while (vFrames.Count < VIDEO_MIX_QUEUE_SIZE && isPlaying && decoder != null && decoder.isRunning)
                    {
                        Thread.Sleep(10);
                    }
                }

                screamer = new Thread(() =>
                {
                    Screamer();
                    TimeEndPeriod(1);
                    status = Status.STOPPED;
                    Log("[SCREAMER] " + status);
                });
                screamer.SetApartmentState(ApartmentState.STA);
                screamer.Priority = ThreadPriority.AboveNormal;
                screamer.Start();
            }

            return(0);
        }
Exemple #2
0
        private void Play2()
        {
            if (screamer != null)
            {
                screamer.Abort();
            }
            if (aScreamer != null)
            {
                aScreamer.Abort();
            }
            if (vScreamer != null)
            {
                vScreamer.Abort();
            }
            if (sScreamer != null)
            {
                sScreamer.Abort();
            }

            lock (aFrames) aFrames = new ConcurrentQueue <MediaFrame>();
            //lock (vFrames) vFrames = new ConcurrentQueue<MediaFrame>();
            lock (sFrames) sFrames = new ConcurrentQueue <MediaFrame>();
            status = Status.PLAYING;

            screamer = new Thread(() =>
            {
                // Reset AVS Decoders to CurTime

                // Video | Seek | Set First Video Timestamp | Run Decoder
                videoStartTicks = -1;
                if (vFrames.Count < 1)
                {
                    decoder.SeekAccurate((int)(CurTime / 10000), FFmpeg.AutoGen.AVMediaType.AVMEDIA_TYPE_VIDEO);
                }
                if (vFrames.Count < 1)
                {
                    return;
                }

                MediaFrame vFrame;
                lock (vFrames) vFrames.TryPeek(out vFrame);
                CurTime         = vFrame.timestamp;
                videoStartTicks = vFrame.timestamp;
                TimeBeginPeriod(1);

                if (decoder.RunVideo() != 0)
                {
                    return;
                }

                // Audio | Seek | Run Decoder
                if (decoder.hasAudio)
                {
                    AudioResetClbk.Invoke();
                    decoder.SeekAccurate((int)((CurTime - audioExternalDelay) / 10000) - 50, FFmpeg.AutoGen.AVMediaType.AVMEDIA_TYPE_AUDIO);
                    decoder.RunAudio();
                }

                // Audio | Seek | Run Decoder
                if (decoder.hasSubs)
                {
                    decoder.SeekAccurate((int)((CurTime - subsExternalDelay) / 10000) - 100, FFmpeg.AutoGen.AVMediaType.AVMEDIA_TYPE_SUBTITLE);
                    decoder.RunSubs();
                }

                // Fill Queues at least with Min
                while (isPlaying && vFrames.Count < VIDEO_MIX_QUEUE_SIZE || (decoder.hasAudio && aFrames.Count < AUDIO_MIX_QUEUE_SIZE && !decoder.isAudioFinish) || (decoder.hasSubs && sFrames.Count < SUBS_MIN_QUEUE_SIZE && !decoder.isSubsFinish))
                {
                    Thread.Sleep(20);
                }

                vScreamer = new Thread(() => {
                    try
                    {
                        VideoScreamer();
                    } catch (Exception) { }

                    TimeEndPeriod(1);
                });
                vScreamer.SetApartmentState(ApartmentState.STA);

                if (decoder.hasAudio)
                {
                    aScreamer = new Thread(() => {
                        try
                        {
                            AudioScreamer();
                        } catch (Exception) { }
                    });
                    aScreamer.SetApartmentState(ApartmentState.STA);
                }

                if (decoder.hasSubs)
                {
                    sScreamer = new Thread(() =>
                    {
                        try
                        {
                            SubsScreamer();
                        } catch (Exception) { }
                    });
                    sScreamer.SetApartmentState(ApartmentState.STA);
                }

                vScreamer.Start();
                if (decoder.hasAudio)
                {
                    aScreamer.Start();
                }
                if (decoder.hasSubs)
                {
                    sScreamer.Start();
                }
            });
            screamer.SetApartmentState(ApartmentState.STA);
            screamer.Priority = ThreadPriority.AboveNormal;
            screamer.Start();
        }