|
|
@@ -335,6 +335,64 @@ private slots:
|
|
|
out << "平均同步误差: " << (stats.avgSyncError * 1000) << " ms\n";
|
|
|
out << "最大同步误差: " << (stats.maxSyncError * 1000) << " ms\n\n";
|
|
|
|
|
|
+ // 写入详细时钟信息
|
|
|
+ out << "=== 时钟信息 ===\n";
|
|
|
+ if (m_player) {
|
|
|
+ auto debugInfo = QString::fromStdString(m_player->getDebugInfo());
|
|
|
+ QStringList lines = debugInfo.split('\n');
|
|
|
+
|
|
|
+ for (const QString& line : lines) {
|
|
|
+ if (line.trimmed().startsWith("Audio:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ bool ok;
|
|
|
+ double value = parts[1].trimmed().toDouble(&ok);
|
|
|
+ if (ok) {
|
|
|
+ out << "音频时钟: " << value << " 秒\n";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (line.trimmed().startsWith("Video:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ bool ok;
|
|
|
+ double value = parts[1].trimmed().toDouble(&ok);
|
|
|
+ if (ok) {
|
|
|
+ out << "视频时钟: " << value << " 秒\n";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (line.trimmed().startsWith("External:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ bool ok;
|
|
|
+ double value = parts[1].trimmed().toDouble(&ok);
|
|
|
+ if (ok) {
|
|
|
+ out << "外部时钟: " << value << " 秒\n";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (line.trimmed().startsWith("Master:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ bool ok;
|
|
|
+ double value = parts[1].trimmed().toDouble(&ok);
|
|
|
+ if (ok) {
|
|
|
+ out << "主时钟: " << value << " 秒\n";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (line.contains("Master Clock Type:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ out << "主时钟类型: " << parts[1].trimmed() << "\n";
|
|
|
+ }
|
|
|
+ } else if (line.contains("Sync Strategy:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ out << "同步策略: " << parts[1].trimmed() << "\n";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ out << "\n";
|
|
|
+
|
|
|
// 写入性能统计
|
|
|
out << "=== 性能统计 ===\n";
|
|
|
out << "CPU使用率: " << stats.cpuUsage << "%\n";
|
|
|
@@ -440,11 +498,85 @@ private slots:
|
|
|
.arg(stats.queuedAudioFrames)
|
|
|
.arg(stats.queuedPackets);
|
|
|
|
|
|
- // 同步统计
|
|
|
- statsText += QString("\n\n同步状态:\n当前误差: %1 ms\n平均误差: %2 ms\n最大误差: %3 ms")
|
|
|
- .arg(stats.syncError * 1000, 0, 'f', 1)
|
|
|
- .arg(stats.avgSyncError * 1000, 0, 'f', 1)
|
|
|
- .arg(stats.maxSyncError * 1000, 0, 'f', 1);
|
|
|
+ // 同步统计 - 获取更详细的同步信息
|
|
|
+ QString syncText = "\n\n同步状态:\n当前误差: %1 ms\n平均误差: %2 ms\n最大误差: %3 ms";
|
|
|
+
|
|
|
+ // 如果播放器有同步器,获取详细的时钟信息
|
|
|
+ if (m_player) {
|
|
|
+ auto debugInfo = QString::fromStdString(m_player->getDebugInfo());
|
|
|
+
|
|
|
+ // 解析调试信息中的时钟数据
|
|
|
+ QStringList lines = debugInfo.split('\n');
|
|
|
+ QString audioClockStr = "N/A", videoClockStr = "N/A", externalClockStr = "N/A", masterClockStr = "N/A";
|
|
|
+ QString masterTypeStr = "N/A", syncStrategyStr = "N/A";
|
|
|
+
|
|
|
+ for (const QString& line : lines) {
|
|
|
+ if (line.trimmed().startsWith("Audio:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ bool ok;
|
|
|
+ double value = parts[1].trimmed().toDouble(&ok);
|
|
|
+ if (ok) {
|
|
|
+ audioClockStr = QString::number(value, 'f', 3) + "s";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (line.trimmed().startsWith("Video:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ bool ok;
|
|
|
+ double value = parts[1].trimmed().toDouble(&ok);
|
|
|
+ if (ok) {
|
|
|
+ videoClockStr = QString::number(value, 'f', 3) + "s";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (line.trimmed().startsWith("External:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ bool ok;
|
|
|
+ double value = parts[1].trimmed().toDouble(&ok);
|
|
|
+ if (ok) {
|
|
|
+ externalClockStr = QString::number(value, 'f', 3) + "s";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (line.trimmed().startsWith("Master:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ bool ok;
|
|
|
+ double value = parts[1].trimmed().toDouble(&ok);
|
|
|
+ if (ok) {
|
|
|
+ masterClockStr = QString::number(value, 'f', 3) + "s";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (line.contains("Master Clock Type:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ masterTypeStr = parts[1].trimmed();
|
|
|
+ }
|
|
|
+ } else if (line.contains("Sync Strategy:")) {
|
|
|
+ QStringList parts = line.split(":");
|
|
|
+ if (parts.size() >= 2) {
|
|
|
+ syncStrategyStr = parts[1].trimmed();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ syncText = QString("\n\n同步状态:\n当前误差: %1 ms\n平均误差: %2 ms\n最大误差: %3 ms\n\n时钟信息:\n音频时钟: %4\n视频时钟: %5\n外部时钟: %6\n主时钟: %7\n\n同步配置:\n主时钟类型: %8\n同步策略: %9")
|
|
|
+ .arg(stats.syncError * 1000, 0, 'f', 1)
|
|
|
+ .arg(stats.avgSyncError * 1000, 0, 'f', 1)
|
|
|
+ .arg(stats.maxSyncError * 1000, 0, 'f', 1)
|
|
|
+ .arg(audioClockStr)
|
|
|
+ .arg(videoClockStr)
|
|
|
+ .arg(externalClockStr)
|
|
|
+ .arg(masterClockStr)
|
|
|
+ .arg(masterTypeStr)
|
|
|
+ .arg(syncStrategyStr);
|
|
|
+ } else {
|
|
|
+ syncText = syncText.arg(stats.syncError * 1000, 0, 'f', 1)
|
|
|
+ .arg(stats.avgSyncError * 1000, 0, 'f', 1)
|
|
|
+ .arg(stats.maxSyncError * 1000, 0, 'f', 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ statsText += syncText;
|
|
|
|
|
|
// 性能统计
|
|
|
statsText += QString("\n\n性能:\nCPU: %1%\n内存: %2 MB\n比特率: %3 kbps")
|
|
|
@@ -584,10 +716,10 @@ private:
|
|
|
refreshLayout->addStretch();
|
|
|
statsLayout->addLayout(refreshLayout);
|
|
|
|
|
|
- m_statsLabel = new QLabel("帧数: 0\n丢帧: 0 (0.0%)\n重复帧: 0\n速度: 1.0x\n\n队列状态:\n视频帧: 0\n音频帧: 0\n数据包: 0\n\n同步状态:\n当前误差: 0.0 ms\n平均误差: 0.0 ms\n最大误差: 0.0 ms\n\n性能:\nCPU: 0.0%\n内存: 0.0 MB\n比特率: 0 kbps");
|
|
|
+ m_statsLabel = new QLabel("帧数: 0\n丢帧: 0 (0.0%)\n重复帧: 0\n速度: 1.0x\n\n队列状态:\n视频帧: 0\n音频帧: 0\n数据包: 0\n\n同步状态:\n当前误差: 0.0 ms\n平均误差: 0.0 ms\n最大误差: 0.0 ms\n\n时钟信息:\n音频时钟: N/A\n视频时钟: N/A\n外部时钟: N/A\n主时钟: N/A\n\n同步配置:\n主时钟类型: N/A\n同步策略: N/A\n\n性能:\nCPU: 0.0%\n内存: 0.0 MB\n比特率: 0 kbps");
|
|
|
m_statsLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop);
|
|
|
m_statsLabel->setWordWrap(true);
|
|
|
- m_statsLabel->setMinimumHeight(300); // 设置最小高度以显示所有统计信息
|
|
|
+ m_statsLabel->setMinimumHeight(450); // 增加最小高度以显示更多同步信息
|
|
|
statsLayout->addWidget(m_statsLabel);
|
|
|
rightLayout->addWidget(statsGroup);
|
|
|
|