From 31a8a877d939816cc0250967ef65b51b68f8056f Mon Sep 17 00:00:00 2001 From: sladro Date: Tue, 16 Dec 2025 16:13:55 +0800 Subject: [PATCH] update plugins/input_rtsp/input_rtsp_node.cpp --- plugins/input_rtsp/input_rtsp_node.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/plugins/input_rtsp/input_rtsp_node.cpp b/plugins/input_rtsp/input_rtsp_node.cpp index 0605745..ab53a1e 100644 --- a/plugins/input_rtsp/input_rtsp_node.cpp +++ b/plugins/input_rtsp/input_rtsp_node.cpp @@ -41,6 +41,7 @@ public: height_ = config.ValueOr("height", 1080); use_ffmpeg_ = config.ValueOr("use_ffmpeg", false); use_mpp_ = config.ValueOr("use_mpp", true); + ffmpeg_force_tcp_ = config.ValueOr("force_tcp", true); if (ctx.output_queues.empty()) { std::cerr << "[input_rtsp] no downstream queue configured for node " << id_ << "\n"; return false; @@ -76,10 +77,10 @@ public: std::cout << "[input_rtsp] start url=" << url_ << " fps=" << fps_; #if defined(RK3588_ENABLE_MPP) if (use_mpp_) std::cout << " (ffmpeg demux + mpp decode)"; - else if (use_ffmpeg_) std::cout << " (ffmpeg cpu decode)"; + else if (use_ffmpeg_) std::cout << " (ffmpeg cpu decode" << (ffmpeg_force_tcp_ ? ", tcp" : ", udp") << ")"; else std::cout << " (stub)"; #else - if (use_ffmpeg_) std::cout << " (ffmpeg cpu decode)"; + if (use_ffmpeg_) std::cout << " (ffmpeg cpu decode" << (ffmpeg_force_tcp_ ? ", tcp" : ", udp") << ")"; else std::cout << " (stub)"; #endif std::cout << "\n"; @@ -125,12 +126,16 @@ private: int video_stream = -1; AVRational time_base{1, 1000}; - if (avformat_open_input(&fmt_ctx, url_.c_str(), nullptr, nullptr) < 0) { + AVDictionary* opts = nullptr; + if (ffmpeg_force_tcp_) av_dict_set(&opts, "rtsp_transport", "tcp", 0); + if (avformat_open_input(&fmt_ctx, url_.c_str(), nullptr, &opts) < 0) { std::cerr << "[input_rtsp] avformat_open_input failed: " << url_ << "\n"; + av_dict_free(&opts); Cleanup(fmt_ctx, codec_ctx, pkt, frm); LoopStub(); return; } + av_dict_free(&opts); if (avformat_find_stream_info(fmt_ctx, nullptr) < 0) { std::cerr << "[input_rtsp] avformat_find_stream_info failed\n"; Cleanup(fmt_ctx, codec_ctx, pkt, frm); @@ -373,12 +378,16 @@ private: int video_stream = -1; AVRational time_base{1, 1000}; - if (avformat_open_input(&fmt_ctx, url_.c_str(), nullptr, nullptr) < 0) { + AVDictionary* opts = nullptr; + if (ffmpeg_force_tcp_) av_dict_set(&opts, "rtsp_transport", "tcp", 0); + if (avformat_open_input(&fmt_ctx, url_.c_str(), nullptr, &opts) < 0) { std::cerr << "[input_rtsp] avformat_open_input failed: " << url_ << "\n"; + av_dict_free(&opts); Cleanup(fmt_ctx, nullptr, pkt, nullptr); LoopStub(); return; } + av_dict_free(&opts); if (avformat_find_stream_info(fmt_ctx, nullptr) < 0) { std::cerr << "[input_rtsp] avformat_find_stream_info failed\n"; Cleanup(fmt_ctx, nullptr, pkt, nullptr); @@ -519,6 +528,7 @@ private: uint64_t frame_id_ = 0; bool use_ffmpeg_ = false; bool use_mpp_ = true; + bool ffmpeg_force_tcp_ = true; }; REGISTER_NODE(InputRtspNode, "input_rtsp");