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); }
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(); }