public virtual bool SetPlaybackRate(double value)
        {
            if (_graphBuilder == null)
            {
                return(false);
            }
            IMediaSeeking mediaSeeking = _graphBuilder as IMediaSeeking;

            if (mediaSeeking == null)
            {
                return(false);
            }
            double currentRate;

            if (mediaSeeking.GetRate(out currentRate) == 0 && currentRate != value)
            {
                bool result = mediaSeeking.SetRate(value) == 0;
                if (result)
                {
                    FirePlaybackStateChanged();
                }
                return(result);
            }
            return(false);
        }
Exemple #2
0
 public CAviDS(string filename, double playSpeed)
 {
     builder              = new FilterGraph() as IGraphBuilder;
     grabber              = new SampleGrabber() as ISampleGrabber;
     mediaType            = new AMMediaType();
     mediaType.majorType  = MediaType.Video;
     mediaType.subType    = MediaSubType.RGB32;
     mediaType.formatType = FormatType.VideoInfo;
     DsError.ThrowExceptionForHR(grabber.SetMediaType(mediaType));
     DsError.ThrowExceptionForHR(builder.AddFilter(grabber as IBaseFilter, "Sample Grabber(DTXMania)"));
     DsError.ThrowExceptionForHR(builder.RenderFile(filename, null));
     CDirectShow.ConnectNullRendererFromSampleGrabber(builder, grabber as IBaseFilter);
     if (builder is IVideoWindow videoWindow)
     {
         videoWindow.put_AutoShow(OABool.False);
     }
     DsError.ThrowExceptionForHR(grabber.GetConnectedMediaType(mediaType));
     videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));
     nWidth    = videoInfo.BmiHeader.Width;
     nHeight   = videoInfo.BmiHeader.Height;
     seeker    = builder as IMediaSeeking;
     DsError.ThrowExceptionForHR(seeker.GetDuration(out nMediaLength));
     DsError.ThrowExceptionForHR(seeker.SetRate(playSpeed / 20.0));
     control = builder as IMediaControl;
     filter  = builder as IMediaFilter;
     grabber.SetBufferSamples(BufferThem: true);
     Run();
     Pause();
     bPlaying = false;
     bPause   = false;
 }
Exemple #3
0
 public void SetSpeed(double rate)
 {
     if (ms != null)
     {
         ms.SetRate(rate);
     }
 }
Exemple #4
0
        private void DoSetRate(double newRate)
        {
            int           hr;
            IMediaControl mc = (IMediaControl)currentFilterGraph;

            // Stop
            hr = mc.Stop();
            DsError.ThrowExceptionForHR(hr);
            // Stop ASFWriter
            hr = currentOutputFilter.Stop();
            DsError.ThrowExceptionForHR(hr);

            if (UsingSBEFilter)
            {
                IStreamBufferMediaSeeking mSeek = (IStreamBufferMediaSeeking)currentSBEfilter;
                DsLong lDouble = DsLong.FromInt64(Convert.ToInt64(newRate));
                hr = mSeek.SetRate(lDouble);
                DsError.ThrowExceptionForHR(hr);
            }
            else
            {
                // IMediaSeeking is used on the filter graph which distributes the calls
                IMediaSeeking mSeek = (IMediaSeeking)currentFilterGraph;
                hr = mSeek.SetRate(newRate);
                DsError.ThrowExceptionForHR(hr);
            }

            // Start ASF
            hr = currentOutputFilter.Run(0);
            DsError.ThrowExceptionForHR(hr);
            // Run again
            hr = mc.Run();
            DsError.ThrowExceptionForHR(hr);
        }
        void ITimeShifting.SetRate(double rate)
        {
            if (rate >= 0 && rate < 0.1)
            {
                rate = 0.1;
            }
            else if (rate < 0 && rate > -0.1)
            {
                rate = -0.1;
            }

            int hr = 0;

            IStreamBufferMediaSeeking2 mediaSeeking2 = this.streamBufferSource as IStreamBufferMediaSeeking2;

            if (mediaSeeking2 != null)
            {
                //mediaSeeking2.SetRateEx(rate, 25);
                hr = mediaSeeking2.SetRateEx(rate, 25);
                if (hr == 0)
                {
                    return;
                }
            }

            IStreamBufferMediaSeeking mediaSeeking1 = this.streamBufferSource as IStreamBufferMediaSeeking;

            if (mediaSeeking1 != null)
            {
                hr = mediaSeeking1.SetRate(rate);
                if (hr == 0)
                {
                    return;
                }
            }

            IMediaSeeking mediaSeeking0 = this.graphBuilder2 as IMediaSeeking;

            if (mediaSeeking0 != null)
            {
                hr = mediaSeeking0.SetRate(rate);
                if (hr == 0)
                {
                    return;
                }
            }
        }
        public virtual bool SetPlaybackRate(double value)
        {
            if (_graphBuilder == null || _ms == null)
            {
                return(false);
            }
            double currentRate;

            if (_ms.GetRate(out currentRate) == 0 && currentRate != value)
            {
                bool result = _ms.SetRate(value) == 0;
                if (result)
                {
                    FirePlaybackStateChanged();
                }
                return(result);
            }
            return(false);
        }
Exemple #7
0
        /// <summary>
        /// Test Get/Set Rate
        /// </summary>
        void TestRate()
        {
            int    hr;
            double dRate1, dRate2;

            // Read the current play rate
            hr = m_ims.GetRate(out dRate1);
            Marshal.ThrowExceptionForHR(hr);

            // Change the rate
            hr = m_ims.SetRate(dRate1 + 1);
            Marshal.ThrowExceptionForHR(hr);

            // Re-read the rate
            hr = m_ims.GetRate(out dRate2);
            Marshal.ThrowExceptionForHR(hr);

            // See if we got the right answer
            Debug.Assert(dRate1 + 1 == dRate2, "Get/Set Rate");
        }
Exemple #8
0
        private void open()
        {
            int hr;

            if (this.GraphBuilder == null)
            {
                this.GraphBuilder = (IGraphBuilder) new FilterGraph();

                hr = GraphBuilder.RenderFile(file, null);//读取文件
                DsError.ThrowExceptionForHR(hr);
                this.MediaControl = (IMediaControl)this.GraphBuilder;
                this.MediaEventEx = (IMediaEventEx)this.GraphBuilder;
                MediaSeeking      = (IMediaSeeking)this.GraphBuilder;
                MediaSeeking.SetTimeFormat(TIME_FORMAT_FRAME);
                MediaSeeking.SetRate(0.3);
                this.VideoFrameStep = (IVideoFrameStep)this.GraphBuilder;
                // MediaPosition= (IMediaPosition)this.GraphBuilder;
                this.VideoWindow = this.GraphBuilder as IVideoWindow;
                this.BasicVideo  = this.GraphBuilder as IBasicVideo;
                this.BasicAudio  = this.GraphBuilder as IBasicAudio;

                hr = this.MediaEventEx.SetNotifyWindow(this.Handle, WM_GRAPHNOTIFY, IntPtr.Zero);
                DsError.ThrowExceptionForHR(hr);


                hr = this.VideoWindow.put_Owner(this.Handle);
                DsError.ThrowExceptionForHR(hr);
                hr = this.VideoWindow.put_WindowStyle(WindowStyle.Child |
                                                      WindowStyle.ClipSiblings | WindowStyle.ClipChildren);
                DsError.ThrowExceptionForHR(hr);
                this.Focus();
                hr = InitVideoWindow(1, 1);
                DsError.ThrowExceptionForHR(hr);
                long time;
                MediaSeeking.GetDuration(out time);
                label20.Text = time.ToString();
                trackBar1.SetRange(0, (int)time);
                t = new Thread(new ThreadStart(updateTimeBarThread));
            }
        }
Exemple #9
0
        protected virtual HRESULT PreparePlayback()
        {
            m_MediaControl  = (IMediaControl)m_GraphBuilder;
            m_BasicVideo    = (IBasicVideo)m_GraphBuilder;
            m_MediaSeeking  = (IMediaSeeking)m_GraphBuilder;
            m_VideoWindow   = (IVideoWindow)m_GraphBuilder;
            m_MediaEventEx  = (IMediaEventEx)m_GraphBuilder;
            m_FrameStep     = (IVideoFrameStep)m_GraphBuilder;
            m_MediaPosition = (IMediaPosition)m_GraphBuilder;
            SettingUpVideoWindow();
            int hr = m_MediaEventEx.SetNotifyWindow(m_EventControl.Handle, WM_GRAPHNOTIFY, Marshal.GetIUnknownForObject(this));

            Debug.Assert(hr == 0);
            SetVolume(m_bMute ? -10000 : m_iVolume);
            if (m_dRate != 1.0)
            {
                m_MediaSeeking.SetRate(m_dRate);
                m_MediaSeeking.GetRate(out m_dRate);
            }
            OnPlaybackReady?.Invoke(this, EventArgs.Empty);
            return((HRESULT)hr);
        }
Exemple #10
0
        void IPlayer.SetRate(double rate)
        {
            if (rate >= 0 && rate < 0.1)
            {
                rate = 0.1;
            }
            else if (rate < 0 && rate > -0.1)
            {
                rate = -0.1;
            }

            int hr = 0;

            IMediaSeeking mediaSeeking = this.graphBuilder as IMediaSeeking;

            if (mediaSeeking != null)
            {
                hr = mediaSeeking.SetRate(rate);
                if (hr == 0)
                {
                    return;
                }
            }
        }
Exemple #11
0
        public CAviDS(string filename, double playSpeed)
        {
            int hr = 0x0;

            builder = (IGraphBuilder) new FilterGraph();

            #region [Sample Grabber]
            {
                grabber              = new SampleGrabber() as ISampleGrabber;
                mediaType            = new AMMediaType();
                mediaType.majorType  = MediaType.Video;
                mediaType.subType    = MediaSubType.RGB32;
                mediaType.formatType = FormatType.VideoInfo;
                hr = grabber.SetMediaType(mediaType);
                DsError.ThrowExceptionForHR(hr);

                hr = builder.AddFilter((IBaseFilter)grabber, "Sample Grabber");
                DsError.ThrowExceptionForHR(hr);
            }
            #endregion

            hr = builder.RenderFile(filename, null);
            DsError.ThrowExceptionForHR(hr);

            // Null レンダラに接続しないとウィンドウが表示される。
            // また、レンダリングを行わないため処理速度を向上できる。
            CDirectShow.ConnectNullRendererFromSampleGrabber(builder, grabber as IBaseFilter);
            CDirectShow.tグラフを解析しデバッグ出力する(builder);

            IVideoWindow videoWindow = builder as IVideoWindow;
            if (videoWindow != null)
            {
                videoWindow.put_AutoShow(OABool.False);
            }

            #region [Video Info]
            {
                hr = grabber.GetConnectedMediaType(mediaType);
                DsError.ThrowExceptionForHR(hr);

                videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));
                nWidth    = videoInfo.BmiHeader.Width;
                nHeight   = videoInfo.BmiHeader.Height;
            }
            #endregion

            #region [ Seeker ]
            {
                seeker = builder as IMediaSeeking;
                hr     = seeker.GetDuration(out nMediaLength);
                DsError.ThrowExceptionForHR(hr);
                hr = seeker.SetRate(playSpeed / 20);
                DsError.ThrowExceptionForHR(hr);
            }
            #endregion

            #region [Control]
            {
                control = builder as IMediaControl;
            }
            #endregion

            #region [Filter]
            {
                filter = builder as IMediaFilter;
            }
            #endregion

            grabber.SetBufferSamples(true);
            this.Run();
            this.Pause();

            bPlaying = false;
            bPause   = false;                   // 外見えには演奏停止している。PAUSE中として外に見せないこと。
        }
 protected virtual HRESULT PreparePlayback()
 {
     m_MediaControl = (IMediaControl)m_GraphBuilder;
     m_BasicVideo = (IBasicVideo)m_GraphBuilder;
     m_MediaSeeking = (IMediaSeeking)m_GraphBuilder;
     m_VideoWindow = (IVideoWindow)m_GraphBuilder;
     m_MediaEventEx = (IMediaEventEx)m_GraphBuilder;
     m_FrameStep = (IVideoFrameStep)m_GraphBuilder;
     SettingUpVideoWindow();
     int hr = m_MediaEventEx.SetNotifyWindow(m_EventControl.Handle, WM_GRAPHNOTIFY, Marshal.GetIUnknownForObject(this));
     Debug.Assert(hr == 0);
     SetVolume(m_bMute ? -10000 : m_iVolume);
     if (m_dRate != 1.0)
     {
         m_MediaSeeking.SetRate(m_dRate);
         m_MediaSeeking.GetRate(out m_dRate);
     }
     if (OnPlaybackReady != null) OnPlaybackReady(this, EventArgs.Empty);
     return (HRESULT)hr;
 }