三分屏的播放客户端这个项目已经做了有一段时间了,今天把主要的实现部分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进行显示,既可以实现咯~~~