Qt截屏 X265lib编码 rtsp请求 rtp流发送 (截屏转YUV 4:2:0)实现

一、QT实现截屏为QImage;

这个相对来说网上资料比较多!
   #include  
   #include 
   #include 
   #include
  int main(int argc, char *argv[])
   {
        QScreen *screen= QGuiApplication::primaryScreen(); //获取屏幕接口
        QPixmap disktop_img= screen>grabWindow(0).scaled(
                    1024,768,Qt::IgnoreAspectRatio,Qt::SmoothTransformation
          ); //调整图像大小为1024×768
        QImage disktop=disktop_img.toImage(); //转换为QImage
//RGBA 32位转换为RGB 24位
        QImage  disktop= disktop.convertToFormat(QImage::Format_RGB888);
}

二、实现QImage转YUV:4:2:0


RGBA 是用32位bit来描述一个像素点的,比如宽1024 高768的QImage 实际大小为1024×768×32
一个像素点:8位R、8位的G、8位的B、8位的透明A来组成。
RGB是用24位bit来表示一个像素点的,比如宽1024高768的QImage实际大小为1024×768×24
一个像素点:8位的R、8位的G、8位的B组成。

yuv是由灰度数据+U+V
Y的大小为:图片的宽度×图片的高度;
U的大小为:图片的宽度×图片的高度/4;
V的大小为:图片的宽度×图片的高度/4;
也就是说你拿到一个YUV图像你要知道图像的宽度,高度,4:2:0因为YUV图像文件并不携带宽度,高度信息。也只有得到宽度高度才能在文件中切分出Y,U,V的值;
我们需要用下图来理解YUV 4:2:0

yuv.jpg

这是一张宽13像素×13像素的RGB24位的原图。
1、Y:遍历每个像素(uint_8[3])计算出Y的数据列表;
2、U:每隔一行并且为奇数时计算一个U值存到U的列表中;
3、V:每隔一行并且为奇数时计算一个U值存到V的列表中;
Y的算法:0.299R+0.587G+0.114B;
U的算法:-0.169
R-0.331G+0.5B+128;
V的算法:0.5R-0.419G-0.081*G+128

#include
#include
#include  
#include 
#include 
#include
QList  returnyuv(){ 
 //屏幕
QScreen *screen= QGuiApplication::primaryScreen(); 
//截屏
QPixmap disktop_img= screen->grabWindow(0).scaled(1024,768,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); 
QImage disktop=disktop_img.toImage(); 
//rgba转为rgb,也就是上面提到的rgb24;
disktop= disktop.convertToFormat(QImage::Format_RGB888);
 //rgb  转 yuv 4:2:0
QByteArray y_l,u_l,v_l,yuv; //Y ,U,V
uchar * d=disktop.bits();    //截屏QImage的数据
    //循环变量
    int i,j;
    int width=disktop.width();   //截屏QImage宽
    int height=disktop.height(); //截屏QImage高
    uint8_t r,g,b,y,u,v;            
    for(i=0;i yuv_byte;  //[Y[Qbytearray],U[Qbytearray],V[Qbytearray]]
    yuv_byte.append(y_l);
    yuv_byte.append(v_l);
    yuv_byte.append(u_l);
    return yuv_byte; //返回yuv
}

//验证转换是否成功
int main(){
    QFile write_file_yuv("./tmp.yuv");
    write_file_yuv.open(QIODevice::WriteOnly);
    if (write_file_yuv.isOpen()){
         QByteArray tmp_file;
        QList yuv_byte= returnyuv(); //调用截屏返回[y,u,v]
        for(int i=0;i


yuview 播放器\color{rgb(255,0,0)}{注意:选择格式为yuv 4:2:0,宽度为1024,高为768,yuv图像不带宽高信息,所以你必须知道你图像的大小}

Overview.png

你可能感兴趣的:(Qt截屏 X265lib编码 rtsp请求 rtp流发送 (截屏转YUV 4:2:0)实现)