Source Filter (File/Device)
→ SampleGrabber (ISampleGrabberCB::BufferCB)
→ Null Renderer / Video Renderer
graphBuilder.AddFilter(sampleGrabber, "Grabber")。sampleGrabber.SetMediaType(&VideoMediaType)(如 RGB24)。sampleGrabber.SetCallback(this, 1) (1=BufferCB)。public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) {
if (isRecording) {
lock (fileStream) {
byte[] buffer = new byte[BufferLen];
Marshal.Copy(pBuffer, buffer, 0, BufferLen);
fileStream.Write(buffer, 0, BufferLen); // 寫入原始數據或封裝容器
}
}
return 0;
}
isRecording 標誌,配合 MediaSeeking 定位起止時間。原始數據需封裝為 MP4/AVI,建議使用 Media Foundation 或 FFmpeg (P/Invoke) 實現 Muxer,DirectShowLib 僅負責採樣獲取。