diff --git a/conf/config.ini b/conf/config.ini index baff3108..1de26c39 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -342,6 +342,8 @@ rtp_g711_dur_ms = 100 #udp接收数据socket buffer大小配置 #4*1024*1024=4196304 udp_recv_socket_buffer=4194304 +#ps/ts解析后是否等待下一帧以判断本帧是否完整,开启后提高兼容性,但是可能增加延时 +merge_frame=1 [rtc] #rtc播放推流、播放超时时间 diff --git a/src/Common/config.cpp b/src/Common/config.cpp index 6a9c4c45..2b2f716f 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -366,6 +366,7 @@ const string kOpusPT = RTP_PROXY_FIELD "opus_pt"; const string kGopCache = RTP_PROXY_FIELD "gop_cache"; const string kRtpG711DurMs = RTP_PROXY_FIELD "rtp_g711_dur_ms"; const string kUdpRecvSocketBuffer = RTP_PROXY_FIELD "udp_recv_socket_buffer"; +const std::string kMergeFrame = RTP_PROXY_FIELD "merge_frame"; static onceToken token([]() { mINI::Instance()[kDumpDir] = ""; @@ -378,6 +379,7 @@ static onceToken token([]() { mINI::Instance()[kGopCache] = 1; mINI::Instance()[kRtpG711DurMs] = 100; mINI::Instance()[kUdpRecvSocketBuffer] = 4 * 1024 * 1024; + mINI::Instance()[kMergeFrame] = 1; }); } // namespace RtpProxy diff --git a/src/Common/config.h b/src/Common/config.h index 301592e4..7fb85d4a 100644 --- a/src/Common/config.h +++ b/src/Common/config.h @@ -563,6 +563,8 @@ extern const std::string kGopCache; extern const std::string kRtpG711DurMs; // udp recv socket buffer size extern const std::string kUdpRecvSocketBuffer; +// ps/ts解析后是否等待下一帧以判断本帧是否完整,开启后提高兼容性,但是可能增加延时 +extern const std::string kMergeFrame; } // namespace RtpProxy /** diff --git a/src/Rtp/Decoder.cpp b/src/Rtp/Decoder.cpp index 6bcebee2..dec48958 100644 --- a/src/Rtp/Decoder.cpp +++ b/src/Rtp/Decoder.cpp @@ -11,6 +11,7 @@ #include "Decoder.h" #include "PSDecoder.h" #include "TSDecoder.h" +#include "Common/config.h" #include "Extension/Factory.h" #if defined(ENABLE_RTPPROXY) || defined(ENABLE_HLS) @@ -122,8 +123,9 @@ void DecoderImp::onDecode(int stream, int codecid, int flags, int64_t pts, int64 WarnL << "Unsupported codec :" << getCodecName(codec); return; } + GET_CONFIG(bool, merge_frame, RtpProxy::kMergeFrame) auto frame = Factory::getFrameFromPtr(codec, (char *)data, bytes, dts, pts); - if (getTrackType(codec) != TrackVideo) { + if (getTrackType(codec) != TrackVideo || !merge_frame) { onFrame(stream, frame); if (_last_is_keyframe && _video_merge) { // 上次是关键帧,收到音频后,说明帧收齐了