C++ 通过DirectShow接收HD RTSP流的最常见方式?

C++ 通过DirectShow接收HD RTSP流的最常见方式?,c++,directshow,rtsp,C++,Directshow,Rtsp,我试图用DirectShow捕捉高清视频流,然后预览并写入文件。在我使用标准视频信号编码器(axis,704x5..)的h264流之前,一切都正常。(AxisRtspSourceFilter+Matroska muxer) 但那个源过滤器不适用于高清编码器(OPR-NH1001080P),所以我试着找到另一个过滤器。(rtsp url类似于rtsp://x.x.x.x:554/sdi) 我安装了一些过滤器,但没有一个能正常工作。好像我不明白什么 MV流源、MVNetworkSource、视频处理

我试图用DirectShow捕捉高清视频流,然后预览并写入文件。在我使用标准视频信号编码器(axis,704x5..)的h264流之前,一切都正常。(AxisRtspSourceFilter+Matroska muxer)

但那个源过滤器不适用于高清编码器(OPR-NH1001080P),所以我试着找到另一个过滤器。(rtsp url类似于rtsp://x.x.x.x:554/sdi)

我安装了一些过滤器,但没有一个能正常工作。好像我不明白什么

MV流源、MVNetworkSource、视频处理项目RTSP,-不工作

从输出MEDIASUBTYPE_H264_bis筛选-不知道如何处理它

不真实的RTSP-在GraphiEdit中工作,但在我的应用程序中不工作(实际上,只进行预览时不进行预览。当我开始录制到文件时,预览窗口中的视频和文件中的视频都带有大的人工制品)

Datastead RTSP源代码-预览+录制效果很好,但我只能用VLC(在播放器之间)播放录制的文件;graphedit崩溃了

我想我可以深入研究非真实/数据集过滤器的问题并解决它们——但我怀疑有些问题我完全不理解。我认为在Windows/directshow中处理rtsp流的任务相当普通,并且有一些标准的解决方案

但是,在stackoverflow,从“我编写了自己的RTSP过滤器和…”开始,有几个问题让我困惑

可能更好的方法是使用ffmpeg库?阻止我这样做的是使用directshow的现有应用程序

更新 ffmpeg的输出带有“-rtsp_传输tcp”

如果我将UDP设置为编码器和ffmpeg的传输,则会有大量的帧丢失

RTP:丢失23个数据包


并且视频被破坏

我们从他们的视频中使用MainConcept RTSP过滤器。它工作得很好。我们也使用他们的编解码器SDK,所以我不知道您是否可以将此过滤器用于其他多路复用器或解码器


在使用此之前,我们还尝试了其他(免费)RTSP过滤器,但其中大多数都不能用于所有RTSP源。如果此摄像头正常工作,则另一个摄像头无法正常工作,反之亦然。

我们将使用其摄像头的Main Concept RTSP过滤器。它工作得很好。我们也使用他们的编解码器SDK,所以我不知道您是否可以将此过滤器用于其他多路复用器或解码器


在使用此之前,我们还尝试了其他(免费)RTSP过滤器,但其中大多数都不能用于所有RTSP源。如果此摄像头正常工作,则另一台无法正常工作,反之亦然。

尝试将此添加为注释,但太长:

我编写了VPP RTSP源过滤器,可以添加一些关于它们如何工作的信息: 在RTSP筛选器中,您基本上要做两件事:

  • 将通过RTSP接收的SDP转换为DirectShow媒体类型
  • 将RTP数据包转换为下游解码器能够理解的DirectShow媒体示例
在VPP RTSP源过滤器中,我们仅处理H.264视频和AMR、PCM、AAC、LATM音频,即我们仅对这些媒体类型执行SDP转换

然而,我们包装的底层RTSP/RTP库(live555)处理更多的媒体类型(live555非常广泛),并且通常很容易向RTSP源过滤器添加更多的媒体类型支持,前提是 -您有一个支持该媒体类型的RTSP服务器 -您有必要的DirectShow解码器过滤器

故障的另一个原因可能是下游解码器拒绝与RTSP源过滤器的连接,例如,如果不支持配置文件,等等


请发布SDP,这可能包含一些进一步的线索

尝试将此添加为注释,但太长:

我编写了VPP RTSP源过滤器,可以添加一些关于它们如何工作的信息: 在RTSP筛选器中,您基本上要做两件事:

  • 将通过RTSP接收的SDP转换为DirectShow媒体类型
  • 将RTP数据包转换为下游解码器能够理解的DirectShow媒体示例
在VPP RTSP源过滤器中,我们仅处理H.264视频和AMR、PCM、AAC、LATM音频,即我们仅对这些媒体类型执行SDP转换

然而,我们包装的底层RTSP/RTP库(live555)处理更多的媒体类型(live555非常广泛),并且通常很容易向RTSP源过滤器添加更多的媒体类型支持,前提是 -您有一个支持该媒体类型的RTSP服务器 -您有必要的DirectShow解码器过滤器

故障的另一个原因可能是下游解码器拒绝与RTSP源过滤器的连接,例如,如果不支持配置文件,等等


请发布SDP,这可能包含一些进一步的线索

我已经发布了带有一些SDP信息的ffmpeg输出。一般来说,VPP筛选器成功连接到源。输出引脚的子类型为MEDIASUBTYPE_H264,但其尺寸为384 crmk_288。它仅连接到ffdshow解码器(与VPP H264解码器的连接失败..)。这就是渲染图片的外观:如果我使用TCP或UDP,没有区别,图片保持不变,我怀疑打包模式是问题所在。相机使用“2=交错”模式,我认为live555只支持“1=非交错”模式。也许@CPlusSharp可以验证主概念堆栈是否支持交错模式。是的,我注意到“交错RTP模式还不受支持。”。但只要我提供“-rtsp_transport tcp”参数,ffmpeg就可以很好地工作,并且捕获的文件在没有伪影的情况下是正确的。陛下我认为ffmpeg使用live555进行RTSP处理是错误的。我已经发布了ffmpeg输出和一些SDP信息。一般来说,VPP筛选器成功连接到源。输出引脚的子类型为MEDIASUBTYPE_H264,但其尺寸为384 crmk_288。它仅连接到ffdshow解码器(连接w