将 Media Foundation H.264 编码器与 live555 一起使用

Use Media Foundation H.264 encoder with live555

我想使用 live555 流媒体库创建 H.264 RTSP 流媒体。为了对视频帧进行编码,我想使用 H.264 编码器 MFT。编码使用基本处理模型进行工作(我不构建图形,而是手动调用 MFT)。使用自定义 FramedSource 源进行流式传输似乎在程序未崩溃且流在 VLC 播放器中稳定的意义上也有效。然而,图像残缺 - 没有颜色,奇怪的线条图案等

我假设我将错误的数据从编码器传递到流媒体库中,但我无法找出该库实际期望的是什么。我读过 Microsoft H.264 编码器在样本中输出多个 NAL。我进一步发现 live555 需要在 doGetNextFrame 中返回单个 NAL。因此,我尝试识别各个 NAL(What does this H264 NAL Header Mean? 声明 header 可以是 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码流?

这是我的做法 MFWebCamRtp

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