2016-02-04 48 views
0

我想使用live555流媒体库创建H.264 RTSP流。为了编码视频帧,我想使用H.264编码器MFT。编码工作使用基本处理模型(我不建立图形,但手动调用MFT)。使用自定义FramedSource源码流也似乎工作的意义,程序不崩溃,并在VLC播放器流稳定。然而,图像是残缺 - 没有颜色的,怪异的线条图案等使用Media Foundation H.264编码器与live555

我认为我从编码到数据流库传递了错误的数据,但什么该库实际上是希望我一直无法找出。我已经读过,Microsoft H.264编码器在一个样本中输出了多个NAL。我进一步发现live555需要在doGetNextFrame中返回单个NAL。因此,我尝试识别单个NAL(What does this H264 NAL Header Mean?指出标题可以是3或4个字节 - 我不知道从哪里获取MF使用的信息,但调试器的内存视图提示4个字节):

for (DWORD i = 0; i < sampleLen; ++i) { 
    auto v = *reinterpret_cast<unsigned int *>(sampleData + i); 
    if (v == ::htonl(1)) { 
     nals.push_back(sampleData + i); 
    } 
} 

这段代码通常标识MFT的一个输出样本中的多个项目。但是,如果我将通过此循环找到的范围复制到fTo输出缓冲区中,VLC不会显示任何内容,并会在几秒钟后停止。我也读过一些live555不想要的幻数0x00000001,所以我试图跳过它。对客户端的影响是一样的。

有什么live555需要我复制到输出缓冲区的文档?

Media Foundation中的H.264编码器是否都能生成可用于流传输的输出样本?

我是否需要分割输出样本?一旦我找到一个幻数(How to write a Live555 FramedSource to allow me to stream H.264 live表明我可能需要跳过超过幻数,因为接受的答案只通过了NAL的有效载荷部分),我需要跳过多少?

有什么方法可以测试H.264 MFT在基本处理模式下返回的采样是否构成一个有效的H.264流?

回答

2

以下是我做过的MFWebCamRtp

我能够流式传输我的摄像头并在VLC中查看它。没有必要深入研究NAL等。来自Media Foundation H264编码器的每个IMFSample包含一个可直接传送到live555的NAL。

+0

感谢分享 - 我的原始代码看起来几乎相同,除了我直接从样本中检索缓冲区而不是使用'ConvertToContiguousBuffer'。我的流仍然有点闪烁,但按照您的说法,直接传递MFT的输出通常是可以的。 – Christoph