Example #1
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;
 }
Example #2
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中として外に見せないこと。
        }