日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QML用openGL渲染NV12

發布時間:2023/12/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QML用openGL渲染NV12 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

把之前寫在windows的播放器移植到了我的安卓手機,就碰到了QOpenGLWidget需要替換的問題。
知乎、CSDN一搜就有渲染YUV420P的代碼,git也有。沒打招呼不放鏈接了。
用的是fbo的那個。主要記錄下參數和問題。


一、QOpenGLTexture改動

NV12的UV數據是在一起的,所以texture只要創建兩個,一個Y,一個UV。
格式套用RGB,RED放Y,GREEN和BLUE放UV:

...mTexY->setFormat(QOpenGLTexture::R8_UNorm);...mTexUV->setFormat(QOpenGLTexture::RG8_UNorm);...

理所當然后面的都要調整:

mTexY->setSize(w, h);mTexY->allocateStorage(QOpenGLTexture::Red, QOpenGLTexture::UInt8);mTexUV->setSize(w/2, h/2);mTexUV->allocateStorage(QOpenGLTexture::RG, QOpenGLTexture::UInt8); QOpenGLPixelTransferOptions options;options.setImageHeight(data.height);options.setRowLength(data.lineSize0);mTexY->setData(QOpenGLTexture::Red, QOpenGLTexture::UInt8, data.data0.data(), &options);options.setRowLength(data.lineSize1/2);options.setImageHeight(data.height/2);mTexUV->setData(QOpenGLTexture::RG, QOpenGLTexture::UInt8, data.data1.data(), &options);

上面lineSize是ffmpeg解碼出來的,linesize0和linesize1都是圖像的寬。

二、Fragment Src

const char *fsrc = "\varying mediump vec4 textureOut; \uniform sampler2D textureY; \uniform sampler2D textureUV; \void main(void) \{\vec3 yuv; \vec3 rgb; \yuv.x = texture2D(textureY, textureOut.st).r - 0.0625; \yuv.y = texture2D(textureUV, textureOut.st).r - 0.5; \yuv.z = texture2D(textureUV, textureOut.st).g - 0.5; \rgb = mat3( 1, 1, 1, \0, -0.39465, 2.03211, \1.13983, -0.58060, 0) * yuv; \gl_FragColor = vec4(rgb, 1); \}";

NV21就把yuv.y和yuv.z的.r .g換一下。

三、 渲染

繪制之前紋理綁定記得改:

m_program.setUniformValue("textureY",0);m_program.setUniformValue("textureUV",1);

Qt5.12.1沒有GL_QUADS了,搜一下這些關鍵詞百度有一個解釋繪制過程的文章,看了下畫4個點的多邊形和4個點的多三角是一樣的:

glDrawArrays(GL_TRIANGLE_FAN,0,4);

用這個。


其他問題

原先寫好了code怎么也渲染不出來,跟了下打印,發現QML把寬高初始化給OpenGL和ffmpeg了,但是和本身控件大小不一致,就造成了glViewport和解碼出來的圖都不能渲染。
QML控件初始化完時在那個槽函數重設一下寬高,YUV寬高和OpenGL各個設置的大小都是一致的就沒問題。

總結

以上是生活随笔為你收集整理的QML用openGL渲染NV12的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。