Obter informações de bitmap do Programa MPEG-2 / Fluxo de Transporte?
Para renderizar um gráfico do DirectShow em meu aplicativo WPF, eu uso um grabber de amostra para gravar um bitmap na memória e lê-lo em outro lugar no código. Isso pode parecer uma solução estranha, mas parece ser a única maneira de obter um pincel WPF.
O código a seguir me fornece as informações necessárias sobre o bitmap:
AMMediaType mt = grabber.GetConnectedMediaType();
VideoInfoHeader header = (VideoInfoHeader)Marshal.PtrToStructure(mt.formatPtr, typeof VideoInfoHeader);
header.BmiHeader // ...
Agora,header.BmiHeader
é do tipoBitmapInfoHeader e fornece informações como olargura ealtura do bitmap. Eu preciso dessa informação para gravar o bitmap na memória.
No entanto, esse código não parece funcionar sempre. Por exemplo, quando o filtro amostrador é conectado a um pino de fluxo de programa MPEG-2,header
seránull
. Por que meu código não funciona com determinados tipos de mídia e que outras formas existem para obter sua estrutura BitmapInfoHeader?
Por favor, note que, embora eu esteja usando odirectshow.net biblioteca, respostas em C ++ também são bem vindas.
Editar: É assim que meu gráfico se parece:
*source* -> MPEG2-Demultiplexer -> SampleGrabber -> MS DTV-DVD Video Decoder -> Video Renderer
Eu não tenho permissão para colocar o grabber entre o decodificador e o renderizador. Sobre o pino de vídeo do demux:
Major Type: Video
Sub Type: MPEG2_VIDEO
Format: MPEG2Video
Depois de ter conectado o grabber de amostra, o pino de entrada também possui o tipo de mídia acima. Quando eu abro este arquivo gráfico na minha aplicação e usograbber.GetConnectedMediaType();
, Eu também recebo o mesmo tipo de mídia. No entanto, oformatPtr
ou (pbFormat
em C ++) deste tipo de mídia é 0.