Я бы хотел использовать 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);