找回密码
 立即注册
收起左侧

Qt编写视频监控系统75-计算实时码率并显示

0
回复
824
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2023-5-25 08:51:51 显示全部楼层 |阅读模式


## 一、前言
做监控摄像头的实时视频显示,一般还会要求统计实时码率显示在通道画面上,一个是为了测试下整个软件的性能,同时也看下当前到底是主码流还是子码流,设备到底是不是真的按照设定的码流大小来传输视频数据的。视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是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);
}
```


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了