我使用FFmpeg创建一个简单的直接显示源过滤器。我从RTSP源读取rtp数据包并将它们提供给解码器。 适用于h264流。
MyRtspSourceFilter[H264 Stream] ---> h264 Decoder --> Video Renderer
坏消息是它不适用于MPEG-4。我能够将我的rtsp源过滤器与MPEG-Decoder连接。我也不例外,但视频渲染器没有显示任何内容。 实际上只显示一帧然后没有 [只是停止] ...解码器和渲染器是第三方所以我无法调试它们。
MyRtspSourceFilter[MP4 Stream] ---> MPEG-4 Decoder --> Video Renderer
我能够成功地使用FFmpeg从MPEG-4 RTSP Source获取rtp数据包。它没有任何问题。
似乎我没有在我的Rtsps Source中设置(?) 过滤器对H264流不是必需的,但可能很重要 MPEG-4流
在直接显示rtsp源过滤器中可能导致此h264流和MPEG-4流差异的原因是什么?任何想法。
更多信息:
- 首先我为MPEG-4 Stream尝试了一些其他的rtsp源过滤器......虽然我的rtsp源相同但我看到它们的引脚连接中有不同的子类型。
- 其次我真的很怀疑,如果源是真正的MPEG-4我用FFmpeg检查...... FFmpeg将源编解码器id作为“CODEC_ID_MPEG4”。
更新 [黑客]
我只是设置m_bmpInfo.biCompression = DWORD('xvid')它只是工作得很好......但它是静态的。 如何使用ffmpeg或其他方式动态获取/确定此值...
答案 0 :(得分: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 Transport 建议,AAC 帧被封装在 ADTS 中,其中像 VLC 这样的 RTSP 播放器需要平面 AAC,因此可用的 RTSP 服务器实现AACSource::HandleFrame() 将 ADTS 标头关闭。
另一个不同的是“时间戳和RTP”: VLC 不支持音频和视频之间的时间偏移补偿。几乎每个 RTSP 生产者或消费者都有时间偏移的限制或未记录的假设;您可以考虑使用额外的延迟管道来补偿 RTSP 源的偏移。