RTSP 隧道 HTTP、FFMPEG

Posted

技术标签:

【中文标题】RTSP 隧道 HTTP、FFMPEG【英文标题】:RTSP tunneled HTTP, FFMPEG 【发布时间】:2013-01-05 17:45:24 【问题描述】:

我正在尝试从使用 RTSP over HTTP 的 Axis 网络摄像机进行流式传输。 我可以让正常的 RTSP 流工作,但我找不到任何关于如何实际设置流的隧道模式的信息或文档。源代码通过将 control_transport 设置为 RTSP_MODE_TUNNEL 来支持它。我的问题很简单,我该如何用下面的代码做到这一点?

 int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);

我尝试了以下方法:

pFormatCtx = avformat_alloc_context();
pFormatCtx->priv_data = malloc(sizeof(RTSPState));
RTSPState *rt = pFormatCtx->priv_data;
rt->control_transport = RTSP_MODE_TUNNEL;
int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);

但它对我来说只是忽略了它(它仍然继续使用 RTP)。我也试过了

 int ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip/axis-media/media.amp" UTF8String], NULL, NULL);
RTSPState *rt = pFormatCtx->priv_data;
rt->control_transport = RTSP_MODE_TUNNEL;

我将如何解决这个问题?我认为这是非常简单的事情,因为 ENUM 就在那里。

可行的解决方案是

AVDictionary *opts = 0;
int ret = av_dict_set(&opts, "rtsp_transport", "http", 0);


ret = avformat_open_input(&pFormatCtx, [@"rtsp://ip:80/axis-media/media.amp" UTF8String], NULL, &opts);

av_dict_free(&opts);

【问题讨论】:

【参考方案1】:

你试过了吗

AVDictionary *opts = 0;
    if (usesTcp) 
        int ret = av_dict_set(&opts, "rtsp_transport", "tcp", 0);
    


    err = avformat_open_input(&avfContext, filename, NULL, &opts);
    av_dict_free(&opts);

【讨论】:

谢谢!奇迹般有效。在调查此问题时,您的 *** 和公司博客提供了很多有用的信息。 @Michelle Cannon:你是如何设置 usesTcp 标志的?无论如何要找出 RTSP 流是否通过 tcp、http 或 udp? 我们手动设置它,因为我们通常知道我们想要什么。主要问题是,在您打开输入流后,它完全掌握在 ffmpeg 手中。所以你有一些选择,但它们很少。 (1) 为 ffmpeg 创建一个自定义的 IO 处理程序。 (2) ffmpeg 尝试连接后用钩子修改。或者我们已经取得了很好的成功,在将流传递给播放器之前使用“隧道”获取流。为此,我们一直在使用本地实时 555 代理实现。因此,我们可以在将它交给我们的播放器 streamMorePlay 之前做任何我们想做的事情。 我们总是乐于帮助开发者,所以请随时与我们签约。 顺便说一句,似乎一堆 avformat_open_input 选项记录在ffmpeg.org/ffmpeg-protocols.html#rtsp。对于 rtsp_transport 看起来它接受“udp”、“tcp”、“http”和“udp_multicast”。我认为,“rtsp_flags”还有“prefer_tcp”选项,如果无法连接,它会先尝试 TCP,然后再尝试 UDP。我已经确认“rtsp_transport”值至少在 libav 11.7 中有效(顺便说一下,也使用 Axis 相机进行测试)。

以上是关于RTSP 隧道 HTTP、FFMPEG的主要内容,如果未能解决你的问题,请参考以下文章

关于RTSP-Over-HTTP

FFmpegFFmpeg 帮助文档使用

FFmpegFFmpeg常用基本命令

FFmpegFFmpeg常用基本命令

FFmpegFFmpeg 相关术语简介

erlang:如何从套接字接收 HTTP/RTSP 消息?