2010-01-06 13 views
2

프로그램의 일부로 사용자 지정 비디오 파일에서 임의의 프레임을 몇 개 가져올 수 있어야합니다. 비디오 프로세싱 프로그래밍에 대한 경험이 없으므로 이것은 나에게 새로운 것입니다.DirectShow.net을 사용하여 비디오 프레임을 얻는 방법은 무엇입니까?

.Net을 사용하여 Windows XP에서이 작업을 수행하기 위해 DirectShow.net을 사용해야한다고 판단했으나이를 완료하는 방법을 알 수 없습니다. ISampleGrabber 인터페이스를 사용하려고하지만 모든 것을 알아낼 수 없어 예제를 찾을 수 없습니다.

인터넷에 DirectShow.net을 사용하는 예는 거의 없지만 .net을 사용하여 비디오에서 프레임을 가져온 사람은 분명합니다. 그래서 누군가가이 작업을 수행하는 샘플 코드를 알고 있는지 확인하려고합니다. 닫기. 이 코드와 함께 왔어요이 코드 프로젝트 기사와 함께 따라하려고

: 아니오 있기 때문에

// step 1 
IGraphBuilder graphBuilder = (IGraphBuilder)new FilterGraph(); 

// step 2 
IBaseFilter grabberBaseFilter; 
ISampleGrabber sampleGrabber; 
AMMediaType mt; 
grabberBaseFilter = (IBaseFilter)new SampleGrabber(); 
sampleGrabber = (ISampleGrabber)grabberBaseFilter; 
graphBuilder.AddFilter(grabberBaseFilter, "Grabber"); 

// step 3 

mt = new AMMediaType(); 
mt.majorType = MediaType.Video; 
mt.subType = MediaSubType.RGB24; 
mt.formatType = FormatType.VideoInfo; 
sampleGrabber.SetMediaType(mt); 
graphBuilder.RenderFile(filename, null); 

IMediaControl mediaControl = (IMediaControl)graphBuilder; 
IMediaEvent mediaEventEx = (IMediaEvent)graphBuilder; 

sampleGrabber.SetBufferSamples(true); 
sampleGrabber.SetOneShot(true); 

// step 4 

mediaControl.Run(); 

EventCode evCode; 
mediaEventEx.WaitForCompletion(int.MaxValue, out evCode); 

AMMediaType connectedMediaType = new AMMediaType(); 
sampleGrabber.GetConnectedMediaType(connectedMediaType); 

VideoInfoHeader videoHeader = (VideoInfoHeader)connectedMediaType.formatType; 

BitmapInfo bitmapInfo = new BitmapInfo(); 
bitmapInfo.bmiHeader = videoHeader.BmiHeader; 

// ::CreateDIBSection(0, &BitmapInfo, DIB_RGB_COLORS, &buffer, NULL, 0); 
// legacy - GdiFlush(); 

// Copy the image into the buffer. 
int size = 0; 
sampleGrabber.GetCurrentBuffer(ref size, buffer); 

부분 늘 컴파일 videoHeader 캐스트 라인과 끝의 GetCurrentBuffer 라인입니다 버퍼 변수 ...하지만 그것을 해결하기 위해 해야할지 모르겠다.

답변

1

IMediaDet을 사용해보십시오. 내 프로젝트의 Here is a sample;

+0

. 답변을 주셔서 감사합니다. –

+2

IMediaDet에는 하나의 큰 문제가 있습니다. VIDEOINFOHEADER2 형식의 비디오는 지원하지 않습니다. – Yurec

1

더 나은 솔루션은 IBasicVideo.GetCurrentImage 메서드를 사용하는 것입니다. 더 보편적이며 대부분의 동영상에서 작동합니다.

1

변경 것과 :

난 그냥 여기에 다시 게시 주위를 확보하지했다하여 결국 무엇
 
VideoInfoHeader videoHeader = (VideoInfoHeader)Marshal.PtrToStructure(connectedMediaType.formatPtr, typeof(VideoInfoHeader)); 
관련 문제