0

我使用 FFmpeg 创建了一个简单的直接显示源过滤器。我从 RTSP 源读取 rtp 数据包并将它们提供给解码器。它适用于 h264 流。

MyRtspSourceFilter[H264 Stream] ---> h264 Decoder --> Video Renderer

坏消息是它不适用于 MPEG-4。 我可以将我的 rtsp 源过滤器与 MPEG-Decoder 连接起来。我没有例外,但视频渲染器没有显示任何内容。实际上只显示一帧然后什么都没有[只是停止]...解码器和渲染器是第 3 方,所以我无法调试它们。

MyRtspSourceFilter[MP4 Stream] ---> MPEG-4 Decoder --> Video Renderer

我可以使用 FFmpeg 成功地从 MPEG-4 RTSP 源获取 rtp 数据包。没有问题。

似乎我没有在我的 Rtsps 源过滤器中设置一些东西(?),这对于 H264 流来说不是必需的,但对于 MPEG-4 流来说可能很重要

什么可能导致直接显示 rtsp 源过滤器中的这个 h264 流和 MPEG-4 流不同?有任何想法吗。

更多信息:

-- 首先,我为 MPEG-4 流尝试了一些其他 rtsp 源过滤器......虽然我的 rtsp 源是相同的,但我在它们的引脚连接中看到了不同的子类型。

-- 其次,如果源真的是 MPEG-4,我真的很怀疑,所以我用 FFmpeg 进行检查......FFmpeg 将源编解码器 ID 设为“CODEC_ID_MPEG4”。

更新: [黑客]

我只是设置 m_bmpInfo.biCompression = DWORD('xvid') 它工作得很好......但它是静态的。如何 使用 ffmpeg 或其他方式动态获取/确定此值...

4

1 回答 1

1

我在 RTSP 服务器端,需要逐帧转换的不同用例

MP4 file ---> MPEG-4 Decoder --> H264 Encoder -->  RTSP Stream

将部署libav,它是 ffmpeg 的内核。

编辑: 使用 H264 编码的视频层,只需根据 MPEG-4 规范的某些“附件 B”,将视频从以长度为前缀的文件格式“AVCC”重新混合为字节流格式。libav 提供所需的比特流过滤器“h264_mp4toannexb”

MP4 file ---> h264_mp4toannexb_bsf -->  RTSP Stream

现在,为了解码 RTSP:

视频和音频来自不同的通道。解析和解码 H264 流在这里完成:my basic h264 decoder using libav

音频是另一回事: RTP 传输表明,AAC 帧被封装在 ADTS 中,其中像 VLC 之类的 RTSP 播放器期望平面 AAC,因此可用的 RTSP 服务器实现AACSource::HandleFrame()将 ADTS 标头关闭。

另一个不同的是“时间戳和 RTP”:VLC 不支持补偿音频和视频之间的时间偏移。几乎每个 RTSP 生产者或消费者都有时间偏移的约束或未记录的假设;您可能会考虑使用额外的延迟管道来补偿 RTSP 源的偏移。

于 2021-03-12T18:02:44.320 回答