zhuizhu 7 月之前
父节点
当前提交
311110e815
共有 3 个文件被更改,包括 72 次插入35 次删除
  1. 2 2
      config/networkconfig.cpp
  2. 20 5
      libs/AVPlayer/avplayerwidget.cpp
  3. 50 28
      libs/Recorder/encoder_aac.cpp

+ 2 - 2
config/networkconfig.cpp

@@ -93,9 +93,9 @@ void NetworkConfig::initDefaults()
     m_serverConfig.apiPath = "/api";
     
     // 流媒体配置 (默认使用RTMP协议)
-    m_streamConfig.protocol = StreamProtocol::RTMP;
+    m_streamConfig.protocol = StreamProtocol::RTSP;
     m_streamConfig.host = "127.0.0.1"; // 使用项目中的生产服务器
-    m_streamConfig.port = 1935;
+    m_streamConfig.port = 554;
     m_streamConfig.app = "stream";
     m_streamConfig.streamKey = "V1";
     

+ 20 - 5
libs/AVPlayer/avplayerwidget.cpp

@@ -272,15 +272,30 @@ void AVPlayerWidget::stopPlay()
 
 void AVPlayerWidget::setPlayRoomId(const QString &id)
 {
-    // 以当前URL为基准,去掉最后一节后拼接房间ID,避免硬编码服务器地址
+    // 以当前URL为基准,保留 app 与 streamKey(如 V1),仅替换/追加房间ID
     QString base = m_urlEdit->text().trimmed();
     if (base.isEmpty()) {
         base = NetworkConfig::instance().getStreamUrl();
     }
-    // rtmp://106.55.186.74:1935/stream/V1/0198da41-cdb6-78e3-879d-2ea32d58f73f
-    int lastSlash = base.lastIndexOf('/');
-    QString streamBase = lastSlash > 0 ? base.left(lastSlash) : base;
-    QString url = streamBase + "/" + id;
+
+    const QString defaultBase = NetworkConfig::instance().getStreamUrl();
+
+    // 解析出前缀(协议+主机端口)与路径段
+    const int schemePos = base.indexOf("://");
+    const int pathStart = base.indexOf('/', schemePos >= 0 ? schemePos + 3 : 0);
+    const QString prefix = pathStart >= 0 ? base.left(pathStart) : base; // rtmp://host:port
+    const QString path = pathStart >= 0 ? base.mid(pathStart + 1) : QString(); // 去掉开头 '/'
+
+    const QStringList segs = path.split('/', Qt::SkipEmptyParts);
+
+    QString url;
+    if (segs.size() >= 2) {
+        // 保留前两段:app + streamKey(例如 stream/V1),将最后一段替换为 id
+        url = prefix + "/" + segs.at(0) + "/" + segs.at(1) + "/" + id;
+    } else {
+        // 如果当前路径不足两段,退回到默认配置(包含 app 与 streamKey)再追加 id
+        url = defaultBase + "/" + id;
+    }
 
     qDebug() << "setPlayRoomId" << url;
     m_urlEdit->setText(url);

+ 50 - 28
libs/Recorder/encoder_aac.cpp

@@ -553,23 +553,16 @@ int encoder_aac::add_adts_header(AVPacket *packet)
 
     // ADTS头部长度为7字节
     const int adts_header_size = 7;
-    int new_size = packet->size + adts_header_size;
-    
-    // 创建新的缓冲区
-    uint8_t *new_data = (uint8_t*)av_malloc(new_size);
-    if (!new_data) {
-        al_error("Failed to allocate memory for ADTS header");
-        return AE_FFMPEG_ALLOC_FRAME_FAILED;
-    }
-    
+    const int new_size = packet->size + adts_header_size;
+
     // 生成ADTS头部
-    uint8_t adts_header[7];
-    
+    uint8_t adts_header[adts_header_size];
+
     // 获取编码器参数
     int sample_rate = _encoder_ctx->sample_rate;
     int channels = ffmpeg_get_codec_context_channels(_encoder_ctx);
     int profile = _encoder_ctx->profile; // AAC-LC = 1
-    
+
     // 采样率索引映射
     int freq_idx = 4; // 默认44100Hz
     switch (sample_rate) {
@@ -584,14 +577,14 @@ int encoder_aac::add_adts_header(AVPacket *packet)
         case 16000: freq_idx = 8; break;
         case 12000: freq_idx = 9; break;
         case 11025: freq_idx = 10; break;
-        case 8000: freq_idx = 11; break;
-        default: freq_idx = 4; break;
+        case 8000:  freq_idx = 11; break;
+        default:    freq_idx = 4; break;
     }
-    
+
     // 声道配置
     int channel_config = channels;
     if (channels > 6) channel_config = 0; // 自定义配置
-    
+
     // 构建ADTS头部
     adts_header[0] = 0xFF; // syncword (12 bits) - 高8位
     adts_header[1] = 0xF0 | (0 << 3) | (0 << 2) | 1; // syncword低4位 + MPEG版本 + Layer + protection_absent
@@ -600,19 +593,48 @@ int encoder_aac::add_adts_header(AVPacket *packet)
     adts_header[4] = (new_size >> 3) & 0xFF;
     adts_header[5] = ((new_size & 7) << 5) | 0x1F;
     adts_header[6] = 0xFC; // number_of_raw_data_blocks_in_frame (2 bits) + 6位填充
-    
-    // 复制ADTS头部和原始数据
-    memcpy(new_data, adts_header, adts_header_size);
-    memcpy(new_data + adts_header_size, packet->data, packet->size);
-    
-    // 释放原始数据并更新packet
+
+    // 备份原始包的时间戳与元数据
+    int64_t old_pts = packet->pts;
+    int64_t old_dts = packet->dts;
+    int64_t old_duration = packet->duration;
+    int old_flags = packet->flags;
+    int old_stream_index = packet->stream_index;
+    int64_t old_pos = packet->pos;
+
+    // 创建新包并拷贝数据(头部+原数据),以避免清空原包导致PTS/DTS丢失
+    AVPacket *new_pkt = av_packet_alloc();
+    if (!new_pkt) {
+        al_error("Failed to allocate AVPacket for ADTS header");
+        return AE_FFMPEG_ALLOC_FRAME_FAILED;
+    }
+
+    if (av_new_packet(new_pkt, new_size) < 0) {
+        av_packet_free(&new_pkt);
+        al_error("Failed to allocate packet buffer for ADTS header");
+        return AE_FFMPEG_ALLOC_FRAME_FAILED;
+    }
+
+    // 拷贝ADTS头部和原始数据
+    memcpy(new_pkt->data, adts_header, adts_header_size);
+    memcpy(new_pkt->data + adts_header_size, packet->data, packet->size);
+
+    // 恢复时间戳与元数据
+    new_pkt->pts = old_pts;
+    new_pkt->dts = old_dts;
+    new_pkt->duration = old_duration;
+    new_pkt->flags = old_flags;
+    new_pkt->stream_index = old_stream_index;
+    new_pkt->pos = old_pos;
+
+    // 用新包替换旧包
     av_packet_unref(packet);
-    packet->data = new_data;
-    packet->size = new_size;
-    
-    al_debug("ADTS header added: total_size=%d, profile=%d, freq_idx=%d, channels=%d", 
-             new_size, profile, freq_idx, channels);
-    
+    av_packet_move_ref(packet, new_pkt);
+    av_packet_free(&new_pkt);
+
+    al_debug("ADTS header added: total_size=%d, profile=%d, freq_idx=%d, channels=%d (pts=%lld, dts=%lld)",
+             new_size, profile, freq_idx, channels, packet->pts, packet->dts);
+
     return AE_NO;
 }