如何使用 FFMpeg 同时收听 2 个传入的 rtsp 流

Ale*_*kov 5 c ffmpeg rtsp

我可以使用以下代码通过 FFMpeg 库收听和接收一个 rtsp 流:

AVFormatContext* format_context = NULL
char* url = "rtsp://example.com/in/1";
AVDictionary *options = NULL;
av_dict_set(&options, "rtsp_flags", "listen", 0);
av_dict_set(&options, "rtsp_transport", "tcp", 0);

int status = avformat_open_input(&format_context, url, NULL, &options);
av_dict_free(&options);
if( status >= 0 )
{
    status = avformat_find_stream_info( format_context, NULL);
    if( status >= 0 )
    {
        AVPacket av_packet;
        av_init_packet(&av_packet);

        for(;;)
        {                                                                      
            status = av_read_frame( format_context, &av_packet );
            if( status < 0 )
            {
                break;
            }
        }
    }
    avformat_close_input(&format_context);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试同时打开另一个类似的侦听器(在另一个带有另一个 url 的线程中),我会收到错误消息:

无法打开 RTSP 进行侦听 rtsp://example.com/in/2:地址已在使用中

看起来avformat_open_input试图打开已经被先前调用打开的套接字avformat_open_input。有没有办法在 2 个线程之间共享这个套接字?可能 FFMpeg 中有一些调度程序可以完成此类任务。

重要说明:就我而言,我的应用程序必须充当传入 RTSP 连接的侦听服务器!它不是连接到另一个 RTSP 服务器的客户端。

小智 -2

您必须检查视频设备信息。原因是并非每个设备都可以串流多个频道。有限制。但大多数设备可能会串流到多个频道,例如 main_stream、channel_1、channel_2、mjpeg_stream 等。所以您可以同时收听不同的频道。这可能会解决您的问题。PS:通道名称取决于设备制造商。