基于Qt的三分屏播放客户端实现

三分屏的播放客户端这个项目已经做了有一段时间了,今天把主要的实现部分Mark一下;
解码部分还是使用的之前的解码客户端,主要说一下分屏的实现,由于播放的是4320*900分辨率的码流,所以分成三个屏幕上显示,即一个屏幕上显示1440*900分辨率的视频,解码部分和以前一样,创建FFmpeg解码器,将h264或者h265码流解码成YUV数据,YUV数据无法直接在屏幕上显示,所以就需要使用sws_scale函数转成RGB数据,转换完成之后,就需要将一帧的数据分到三个buffer中,算法实现比较简单:
int k=0, p=0, q=0;
for(int i=0; i < height; i++)
{
for(int j=0; j < width*3; j++)
{
int n = j/width;
if(n == 0)
bufferFirstRGB[k++] = bufferRGB[j+i*width*3];
else if(n == 1)
bufferSecRGB[p++] = bufferRGB[j+i*width*3];
else if(n == 2)
bufferThirdRGB[q++] = bufferRGB[j+i*width*3];
}
}

然后再将分割完成的每一部分通过QImage进行封装显示:

QImage tmpImage1((uchar *)bufferFirstRGB,width/3,height,QImage::Format_RGB888);
    QImage image  = tmpImage1.copy();
    QImage tmpImage2((uchar *)bufferSecRGB,width/3,height,QImage::Format_RGB888);
    QImage image2 = tmpImage2.copy();
    QImage tmpImage3((uchar *)bufferThirdRGB,width/3,height,QImage::Format_RGB888);
    QImage image3 = tmpImage3.copy();

    //emit 发送信号
    emit readFirstAreaImage(image);
    emit saveframe(image);
    emit readSecAreaImage(image2);
    emit readThirdAreaImage(image3);

最后发送信号到相应的显示槽函数,显示界面是直接贴了三个label进行显示,既可以实现咯~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值