我可以聽,並使用此代碼與FFmpeg的庫收到一個RTSP流:怎麼聽2個進入RTSP流在同一時間與FFmpeg的
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);
}
但是,如果我嘗試打開另一個類似的監聽器(在在同一時間與另一個URL另一個線程),我得到錯誤:
Unable to open RTSP for listening rtsp://example.com/in/2: Address already in use
它看起來像avformat_open_input
試圖打開這已經是由avformat_open_input
以前調用打開插座。有沒有什麼辦法在2個線程之間共享這個套接字?可能在FFMpeg中有一些調度器用於這樣的任務。
重要注意事項:就我而言,我的應用程序必須作爲傳入RTSP連接的偵聽服務器!它不是連接到另一臺RTSP服務器的客戶端。
如果我理解正確,主RTSP套接字僅用於命令消息,並且在底層級別的RTSP中,所有數據都是在不干擾的獨立RTP流中發送的。所以單獨處理這些流並不困難。 –
它看起來不像FFmpeg允許您直接訪問套接字。但是,您可能可以使用['async'協議處理程序](https://ffmpeg.org/ffmpeg-protocols.html#async)執行此任務。我對代碼不太熟悉,所以不會提供這個答案。我很抱歉誤解你的問題。 – dho
異步協議處理程序看起來很有趣。謝謝 –