• 580阅读
  • 0回复

Qt编写视频监控系统75-计算实时码率并显示 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2023-05-25


## 一、前言
做监控摄像头的实时视频显示,一般还会要求统计实时码率显示在通道画面上,一个是为了测试下整个软件的性能,同时也看下当前到底是主码流还是子码流,设备到底是不是真的按照设定的码流大小来传输视频数据的。视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件。但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来的cbr(固定码率)与vbr(可变码率),都是在这方面做的文章,不过事情总不是绝对的,举例来看,对于一个音频,其码率越高,被压缩的比例越小,音质损失越小,与音源的音质越接近。

在ffmpeg解码后,如果需要统计实时码率,一般需要先知道帧率,比如帧率是25,则统计25帧视频的包大小,累计和就是码率,可能和实际会有一点偏差,偏差不大,这个码率计算后,通过信号发出去,接收到的地方,可以用文字水印的方式滤镜加入到视频帧中,然后用OSD的方式贴到摄像头。其实摄像头厂家可能也具备了实时码率的OSD标签设置,开启即可,开启后摄像头端就自己计算好了,传输过来的视频流就带上了码率。

## 二、效果图



## 三、体验地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 体验地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_video_system。

## 四、相关代码
```cpp
void FFmpegThread::checkRealPacketSize(AVPacket *packet, int maxCount)
{
    realPacketCount++;
    realPacketSize += packet->size;
    if (realPacketCount == maxCount) {
        qreal kbps = (qreal)realPacketSize / 100;
        //debug("实时码率", QString("大小: %1 kbps").arg(QString::number(kbps, 'f', 0)));
        emit receiveKbps(kbps, maxCount);
        realPacketSize = 0;
        realPacketCount = 0;
    }
}

void FFmpegThread::decodeVideo0(AVPacket *packet)
{
    if (countKbps) {
        checkRealPacketSize(packet, frameRate);
    }

    //有些首帧开始的时间不是0而是一个指定的时间所以需要减去
    if (videoFirstPts > 5000) {
        packet->pts -= videoFirstPts;
        packet->dts = packet->pts;
    }

    if (useSync) {
        //加入到队列交给解码同步线程处理
        videoSync->append(FFmpegHelper::creatPacket(packet));
    } else {
        //直接当前线程解码
        decodeVideo1(packet);
        if (decodeType != DecodeType_Fastest) {
            FFmpegHelper::delayTime(formatCtx, packet, startTime);
        }
    }
}

void frmDemoVideoOsd::receiveKbps(qreal kbps, int frameRate)
{
    OsdInfo osd;
    osd.name = "kbps";
    osd.color = "#FF0000";
    osd.fontSize = fontSize;
    osd.position = OsdPosition_RightTop;
    osd.text = QString("%1 kbps\n%2 fps").arg((int)kbps).arg(frameRate);
    ui->videoWidget->setOsd(osd);
}
```
4条评分好评度+1贡献值+1金钱+10威望+1
20091001753 好评度 +1 - 2023-05-25
20091001753 贡献值 +1 - 2023-05-25
20091001753 威望 +1 - 2023-05-25
20091001753 金钱 +10 - 2023-05-25
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个