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