Я хотел бы использовать DirectShow на net x64 - PullRequest
0 голосов
/ 30 января 2020

Я бы хотел использовать Directshow на. net picturebox (Framework) x64.

Однако Directshow не обновляет img picturebox в x64. В x86 это работает очень хорошо.

Также я могу использовать samplegrabber и получать изображение за кадр. Только img Picturebox не изменяется.

И если я дважды вызываю RenderFile () с одним и тем же видеофайлом, это работает, и IMG Picturebox изменяется.

Это мой код.

        AMMediaType am_media_type = new AMMediaType();
        if (MediaLoaded == true)
        {
            Marshal.ReleaseComObject(pGraphBuilder);
            pGraphBuilder = null;
            Marshal.ReleaseComObject(pMediaControl);
            pMediaControl = null;
            Marshal.ReleaseComObject(pMediaSeeking);
            pMediaSeeking = null;
            Marshal.ReleaseComObject(pMediaPosition);
            pMediaPosition = null;
            Marshal.ReleaseComObject(pVideoWindow);
            pVideoWindow = null;
            Marshal.ReleaseComObject(pSampleGrabber);
            pSampleGrabber = null;
            Marshal.ReleaseComObject(pSampleGrabberFilter);
            pSampleGrabberFilter = null;
        }

        pGraphBuilder = new FilterGraph() as IGraphBuilder;
        pSampleGrabber = new SampleGrabber() as ISampleGrabber;
        pSampleGrabberFilter = pSampleGrabber as IBaseFilter;
        pMediaControl = pGraphBuilder as IMediaControl;
        pMediaPosition = pGraphBuilder as IMediaPosition;
        pMediaSeeking = pGraphBuilder as IMediaSeeking;
        pMediaSeeking.SetTimeFormat(TimeFormat.MediaTime);
        pVideoWindow = pGraphBuilder as IVideoWindow;

        am_media_type.majorType = MediaType.Video;
        am_media_type.subType = MediaSubType.RGB24;
        am_media_type.formatType = FormatType.VideoInfo;
        pSampleGrabber.SetMediaType(am_media_type);

        if (isPlaying == true)
        {
            stop();
        }

/// Если я дважды вызываю RenderFile (), он работает очень хорошо.

        //pGraphBuilder.RenderFile(loadedfilepath, null);
        //pVideoWindow.put_Owner(pictureboxhdl.Handle);
        //pVideoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings);
        //pVideoWindow.SetWindowPosition(0, 0, pictureboxhdl.Width, pictureboxhdl.Height);
        //pVideoWindow.put_MessageDrain(pictureboxhdl.Handle);
        //pVideoWindow.put_Visible(OABool.True);

        pGraphBuilder.AddFilter(pSampleGrabberFilter, "Sample Grabber");
        pMediaControl.RenderFile(filepath);
        pSampleGrabber.GetConnectedMediaType(am_media_type);
        VideoInfoHeader pVideoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(am_media_type.formatPtr, typeof(VideoInfoHeader));
        Video_Width = pVideoInfoHeader.BmiHeader.Width;
        Video_Height = pVideoInfoHeader.BmiHeader.Height;
        DsUtils.FreeAMMediaType(am_media_type);
        pSampleGrabber.SetBufferSamples(true);
        pVideoWindow.put_Owner(pictureboxhdl.Handle);
        pVideoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings);
        Rectangle rect = pictureboxhdl.ClientRectangle;
        pVideoWindow.SetWindowPosition(0, 0, rect.Right, rect.Bottom);
...