zhuizhu 6 luni în urmă
părinte
comite
1e76c2ff1f

+ 8 - 2
libs/AVPlayer/av_clock.h

@@ -19,12 +19,18 @@ public:
 
     inline void setClock(double pts) { setCloctAt(pts); }
 
-    inline double getClock() { return m_drift + av_gettime_relative() / 1000000.0; }
+    inline double getClock() { 
+        // 使用高精度时间计算,减少累积误差
+        double currentTime = av_gettime_relative() / 1000000.0;
+        return m_drift + currentTime; 
+    }
 
 private:
     inline void setCloctAt(double pts)
     {
-        m_drift = pts - av_gettime_relative() / 1000000.0;
+        // 使用高精度时间设置,减少设置时的精度损失
+        double currentTime = av_gettime_relative() / 1000000.0;
+        m_drift = pts - currentTime;
         m_pts = pts;
     }
 

+ 6 - 0
libs/AVPlayer/av_decoder.cpp

@@ -40,6 +40,9 @@ AVTool::MediaInfo* Decoder::detectMediaInfo(const QString& url)
     av_dict_set(&formatOpts, "rtsp_transport", LowLatencyConfig::RTSP_TRANSPORT, 0);
     av_dict_set(&formatOpts, "fflags", LowLatencyConfig::FFLAGS, 0);       // 使用配置文件中的标志
     av_dict_set(&formatOpts, "max_delay", LowLatencyConfig::MAX_DELAY, 0);      // 使用配置文件中的最大延迟
+    av_dict_set(&formatOpts, "rtsp_flags", LowLatencyConfig::RTSP_FLAGS, 0);
+    av_dict_set(&formatOpts, "stimeout", LowLatencyConfig::STIMEOUT, 0);
+    av_dict_set(&formatOpts, "user_agent", LowLatencyConfig::USER_AGENT, 0);
     av_dict_set(&formatOpts, "buffer_size", LowLatencyConfig::BUFFER_SIZE, 0);     // 使用配置文件中的缓冲区大小
 
     ret = avformat_open_input(&fmtCtx, url.toUtf8().constData(), nullptr, &formatOpts);
@@ -252,6 +255,9 @@ int Decoder::decode(const QString& url)
     av_dict_set(&formatOpts, "rtsp_transport", LowLatencyConfig::RTSP_TRANSPORT, 0);
     av_dict_set(&formatOpts, "fflags", LowLatencyConfig::FFLAGS, 0);
     av_dict_set(&formatOpts, "max_delay", LowLatencyConfig::MAX_DELAY, 0);
+    av_dict_set(&formatOpts, "rtsp_flags", LowLatencyConfig::RTSP_FLAGS, 0);
+    av_dict_set(&formatOpts, "stimeout", LowLatencyConfig::STIMEOUT, 0);
+    av_dict_set(&formatOpts, "user_agent", LowLatencyConfig::USER_AGENT, 0);
 
     ret = avformat_open_input(&m_fmtCtx, url.toUtf8().constData(), nullptr, &formatOpts);
     if (ret < 0) {

+ 45 - 14
libs/AVPlayer/low_latency_config.h

@@ -3,27 +3,58 @@
 
 // 低延迟模式配置参数(平衡模式 - 类似VLC)
 namespace LowLatencyConfig {
-    // 缓冲区大小优化(平衡模式)
-    constexpr int BALANCED_FRAME_QUEUE_SIZE = 3;     // 3帧 ≈ 100ms@30fps
-    constexpr int BALANCED_PACKET_QUEUE_SIZE = 6;    // 6包 ≈ 200ms
+    // 缓冲区大小优化(动态调整模式)
+    constexpr int BALANCED_FRAME_QUEUE_SIZE = 2;     // 减少到2帧 ≈ 67ms@30fps
+    constexpr int BALANCED_PACKET_QUEUE_SIZE = 4;    // 减少到4包 ≈ 133ms
+    constexpr int MAX_FRAME_QUEUE_SIZE = 5;          // 最大帧队列大小
+    constexpr int MIN_FRAME_QUEUE_SIZE = 1;          // 最小帧队列大小
     
-    // 音频缓冲区优化(稳定模式)
-    constexpr int BALANCED_AUDIO_SAMPLES = 512;      // 512样本 ≈ 11.6ms@44.1kHz
+    // 音频缓冲区优化(动态调整模式)
+    constexpr int BALANCED_AUDIO_SAMPLES = 256;      // 减少到256样本 ≈ 5.8ms@44.1kHz
+    constexpr int MAX_AUDIO_SAMPLES = 1024;          // 最大音频样本数
+    constexpr int MIN_AUDIO_SAMPLES = 128;           // 最小音频样本数
     
-    // 同步阈值优化(温和模式)
-    constexpr double BALANCED_SYNC_THRESHOLD_MIN = 0.02;  // 20ms
-    constexpr double BALANCED_SYNC_THRESHOLD_MAX = 0.06;  // 60ms
-    constexpr double BALANCED_NOSYNC_THRESHOLD = 3.0;     // 3秒放弃同步
-    constexpr double BALANCED_SYNC_FRAMEDUP_THRESHOLD = 0.1;  // 100ms单帧视频时长阈值上限
-    constexpr double BALANCED_SYNC_REJUDGE_THRESHOLD = 0.01;  // 10ms同步重判阈值
+    // 缓冲区动态调整参数
+    constexpr double BUFFER_ADJUST_THRESHOLD = 0.1;  // 缓冲区调整阈值(100ms)
+    constexpr double BUFFER_SHRINK_FACTOR = 0.8;     // 缓冲区收缩因子
+    constexpr double BUFFER_EXPAND_FACTOR = 1.2;     // 缓冲区扩展因子
+    
+    // 同步阈值优化(自适应模式)
+    constexpr double BALANCED_SYNC_THRESHOLD_MIN = 0.01;  // 减少到10ms
+    constexpr double BALANCED_SYNC_THRESHOLD_MAX = 0.04;  // 减少到40ms
+    constexpr double BALANCED_NOSYNC_THRESHOLD = 2.0;     // 减少到2秒放弃同步
+    constexpr double BALANCED_SYNC_FRAMEDUP_THRESHOLD = 0.08;  // 减少到80ms单帧视频时长阈值上限
+    constexpr double BALANCED_SYNC_REJUDGE_THRESHOLD = 0.005;  // 减少到5ms同步重判阈值
+    
+    // 时间戳处理优化参数
+    constexpr double TIMESTAMP_SMOOTH_FACTOR = 0.1;      // 时间戳平滑因子
+    constexpr double TIMESTAMP_JUMP_THRESHOLD = 1.0;     // 时间戳跳跃检测阈值(1秒)
+    constexpr int TIMESTAMP_HISTORY_SIZE = 10;           // 时间戳历史记录大小
+    
+    // 延迟累积控制参数
+constexpr double DELAY_ACCUMULATION_THRESHOLD = 0.5; // 延迟累积阈值
+constexpr double DELAY_RESET_FACTOR = 0.9;           // 延迟重置因子
+constexpr int DELAY_MONITOR_INTERVAL = 30;           // 延迟监控间隔
+
+// 高精度时间处理参数
+constexpr double TIME_PRECISION_FACTOR = 1000000.0;  // 微秒到秒的转换因子
+constexpr double FRAME_TIMER_CORRECTION_THRESHOLD = 0.001; // 帧定时器校正阈值(1ms)
+constexpr double PRECISION_ERROR_COMPENSATION = 0.0001;    // 精度误差补偿值(0.1ms)
+constexpr int TIMER_RESET_INTERVAL = 300;            // 定时器重置间隔(帧数)
+constexpr double MAX_ACCEPTABLE_DRIFT = 0.01;        // 最大可接受漂移(10ms)(帧数)
     
     // 网络优化参数(更新为平衡配置)
     constexpr const char* RTSP_TRANSPORT = "tcp";
-    constexpr const char* PROBE_SIZE = "32768";        // 32KB探测大小
-    constexpr const char* ANALYZE_DURATION = "1000000"; // 1秒分析时长
+    constexpr const char* PROBE_SIZE = "1048576";      // 1MB探测大小 - 增加以获得足够帧进行帧率计算
+    constexpr const char* ANALYZE_DURATION = "3000000"; // 3秒分析时长 - 增加以确保准确的流信息
     constexpr const char* MAX_DELAY = "500000";        // 500ms最大延迟
     constexpr const char* FFLAGS = "nobuffer";         // 无缓冲模式
-    constexpr const char* BUFFER_SIZE = "65536";       // 64KB接收缓冲区
+    constexpr const char* BUFFER_SIZE = "131072";      // 128KB接收缓冲区 - 增加以配合更大的探测大小
+    
+    // RTSP流优化参数
+    constexpr const char* RTSP_FLAGS = "prefer_tcp";   // 优先使用TCP传输
+    constexpr const char* STIMEOUT = "5000000";        // 5秒连接超时
+    constexpr const char* USER_AGENT = "LearningSmartClient/1.0"; // 自定义用户代理
     
     // 解码器优化(平衡配置)
     constexpr int DECODER_THREAD_COUNT = 2;           // 2线程平衡性能与延迟