Uzyskaj informacje o mapie bitowej z MPEG-2 Program / Transport Stream?
Aby wyrenderować wykres DirectShow w mojej aplikacji WPF, używam przykładowego grabbera do zapisania bitmapy w pamięci i przeczytania go w innym miejscu w kodzie. Może to wydawać się dziwnym rozwiązaniem, ale wydaje się, że jest to jedyny sposób, aby uzyskać z niego pędzel WPF.
Poniższy kod daje mi informacje o bitmapie:
AMMediaType mt = grabber.GetConnectedMediaType();
VideoInfoHeader header = (VideoInfoHeader)Marshal.PtrToStructure(mt.formatPtr, typeof VideoInfoHeader);
header.BmiHeader // ...
Teraz,header.BmiHeader
jest typuBitmapInfoHeader i dostarcza informacji takich jakszerokość iwysokość mapy bitowej. Potrzebuję tych informacji, aby zapisać bitmapę w pamięci.
Jednak ten kod nie zawsze działa. Na przykład, gdy przykładowy filtr grabbera jest połączony z pinem strumienia programowego MPEG-2,header
będzienull
. Dlaczego mój kod nie działa z niektórymi typami mediów i jakie są inne sposoby uzyskania struktury BitmapInfoHeader?
Pamiętaj, że mimo że korzystam zdirectshow.net biblioteka, odpowiedzi w C ++ są również mile widziane.
Edytować: Tak wygląda mój wykres:
*source* -> MPEG2-Demultiplexer -> SampleGrabber -> MS DTV-DVD Video Decoder -> Video Renderer
Nie wolno mi umieszczać chwytaka między dekoderem a rendererem. Informacje o pinach wideo demux:
Major Type: Video
Sub Type: MPEG2_VIDEO
Format: MPEG2Video
Po podłączeniu przykładowego chwytaka, jego pin wejściowy ma również powyższy typ nośnika. Kiedy otwieram ten plik wykresu w mojej aplikacji i używamgrabber.GetConnectedMediaType();
, Dostaję również ten sam typ mediów. JednakżeformatPtr
lub (pbFormat
w C ++) tego typu mediów wynosi 0.