當前位置:首頁 » 安卓系統 » androidyuv轉換

androidyuv轉換

發布時間: 2022-12-09 14:22:47

⑴ 如何RGB幀轉換為YUV在Android中使用GPU

優點: Android軟體應用程序介面可以使用CPU或GPU的渲染,包括桌面。由於GPU比CPU能夠更好地處理圖形,GPU渲染它更流暢的應用程序界面也將減少對CPU的負擔。 缺點: 首先是迫使GPU加速會增加功率消耗,減少待機時間。 二是對於不支持GPU加速的一些老程序,開始GPU加速會停止運行(崩潰) 總之,強制GPU渲染將利用GPU的優勢,同時增加了功耗,減少電池壽命,但不會影響手機的使用壽命。

⑵ UVC Camera使用簡單記錄

程序是根據 UVCCamera 去修改的。
使用過程中遇到的幾點關鍵問題:
1.YUV 格式:NV21等格式。
2.YUV轉RGB效率問題。
3.Bitmap內存泄漏問題。
4.Handler內存泄漏的問題

首先onFrame(這是camera取圖的callBack函數,byte[] data就是camera的數據)中不能做耗時操作(例如將data轉bitmap等操作),不然會阻塞(之前把這個操作放到這里然後直接將bitmap傳出)導致卡頓。

在傳輸byte[]數據之後,需要將byte[]轉bitmap。
在byte[] 轉bitmap的過程中,由於創建了過多的Bitmap,會導致內存泄漏,程序崩潰。
因此1.將Bitmap設置為靜態變數,避免重復創建的問題。2.修改byte[] 轉bitmap的函數,原來函數是返回Bitmap,現在是將Bitmap作為參數傳入函數中,直接將Bitmap數據傳遞出去。減少了一個返回的步驟。

之前是這樣的:

現在是這樣的:

後面就是通過handleImage將Bitmap顯示在ImageView上。

NV21轉bitmap的問題。
我的程序基本是根據 UVCCamera 去修改的,UVCCamera中沒有取每一幀,但是留有介面,我這里設定每一幀的數據為NV21格式。

並且在onFrame中取出的data格式是NV21(NV21是YUV中的一個,YUV有很多格式),因此在轉成bitmap的時候,需要根據公式去轉化。用系統自帶的RenderScript去轉換,發現圖片雖然清晰但是顏色不對。

查找yuv轉bitmap函數,找到的是這個。依舊是轉出來的圖片,非常明顯,成像很清晰,但是就是顏色不對。

因此對函數進行了修改。修改後如下所示。

由於對YUV與RGB這個概念模糊不清,而搜索得到的YUV轉bitmap函數是雖然的確是NV21轉bitmap,但轉換後有色差。後修改rgba[]的賦值順序後,顏色才正常。其實就是在由YUV編碼轉RGB編碼的過程中,數據傳遞出現問題才導致色彩異常,這種情況就需要一步步分析YUV到RGB的數據轉換中哪裡出現了問題。之前是存儲為ABGR,後面才是存儲為ARGB。
具體分析可以看這篇:
RGB和YUV簡單學習記錄

但是上面這種方式實際使用中發現效率過低。因此需要使用so的方式去轉換。

具體參考鏈接:
libyuv—libyuv測試使用ARGBToI420和ConvertToARGB介面
https://blog.csdn.net/XIAIBIANCHENG/article/details/73065646

但是這個是yuvI420 數據轉為bitmap 。我在使用的時候需要對format進行修改。

即將void Java_com_example_libyuv_Test_convertToArgb函數中的FOURCC_IYUV改為FOURCC_NV21。

Handle內存泄漏的問題。
之前因為想偷懶所以沒有處理Android studio關於Handle內存泄漏的提示。然後讓程序跑了一天果然崩了。

之前是如下所示,這種寫法Android Studio會提示你這是有風險的。

現在改成如下所示

其實還可通過在activity的destroy中調用 handler.removeCallbacksAndMessages(null) ,來達到避免內存泄漏的目的,android 系統源碼中也基本是使用這個方法。

後記:這篇文章始於2018年,當時是用於雙目USB攝像頭上,最近在整理東西所以完善了一下。
參考鏈接:
Android yuv轉換成bitmap
圖文詳解YUV420數據格式
Android中的YUV格式解析
Nv21轉Bitmap(高效率轉化)
Android 之 Bitmap
Android解惑之Handler為什麼需要是static的

⑶ 如何RGB幀轉換為YUV在Android中使用GPU

進來了

⑷ Android攝像頭獲得YUV格式的視頻,網上很多都把它轉換為RGB為什麼呢能不能把它轉換為H264或者MP4格式的

RGB ? YUV ?這是視頻格式?難道我OUT了,經常和視頻打交道,視頻格式平常的和少見的都略知,就是沒見過這兩種,RGB不會是代表紅綠藍三基色通道的視頻吧,YUV的原理或許和RGB一樣,並不代表格式,而是視頻的顏色通道

⑸ android yuv怎麼轉換成RGB565

參數分別是寬,高,原數據指針,轉化後的目標數據指針。


你找的這個函數是用C寫的,而你的save(byte[]yuv420,Stringpath,intwidth,intheight,intquality)是JAVA,因此你要使用JNI。或者你把cvt_420p_to_rgb565函數轉成JAVA版。

舉個例子使用jni(實際自己測試):

cvt_420p_to_rgb565修改為

#ifdef__cplusplus
extern"C"{
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_類名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData);
#ifdef__cplusplus
};
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_類名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData)
{
unsignedchar*src=(unsignedchar*)(env->GetByteArrayElements(srcData,0));
unsignedchar*dst=(unsignedchar*)(env->GetByteArrayElements(dstData,0));

下面照抄!!

⑹ YUV格式圖像基礎

yuv是一種類似rgb的顏色模型,起源於黑白和彩電的過渡時期。其中Y代表亮度,uv組合起來可以表示色度。yuv信息只有y的信息就足以顯示黑白的圖片,yuv和YCbCr表示相同的東西,且Cb嚴格對應U,Cr嚴格對應V,yuv和rgb可以通過固定公式進行轉換。

yuv轉rgb:

rgb轉yuv:

yuv主流的采樣方式有yuv4:4:4、yuv4:2:2、yuv4:2:0。下圖中以黑點表示采樣該像素點的Y分量,以空心圓圈表示採用該像素點的UV分量,可以看到這些采樣方式是影響uv的采樣的,對y都是全部采樣。

可以看到,yuv格式圖像信息可以比rgb格式佔用的位元組碼更少,所以可以用yuv來傳輸色彩數據,接收到yuv數據後再轉換為rgb來顯示圖像,從而減少了傳輸圖像佔用的帶寬。

yuv衍生出了很多格式,主要是由於其存儲方式決定的。

packed存儲的yuv的存儲先後不同,細分為了yuv、yvu、yvyu、uyvy等等。

planar存儲的yuv依據數組數量分成了yuv分別三個數組表示的完全平面的,以及y一個數組而uv一個數組的半平面(Semi planar)的兩類,而半平面的又可以細分為uv和vu兩個存儲順序。

I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP //安卓Camera默認格式

涉及到攝像頭幀圖像處理的應用經常需要操作Yuv數據幀,例如鏡像、加濾鏡等。

操作yuv圖像可以直接使用google開源的libyuv庫,提供了對yuv圖像的格式轉換、縮放、裁剪、旋轉、鏡像等操作: 谷歌git libyuv ,github上有人用其做了簡單的安卓版本的demo: 安卓libyuvDemo ,包含了基礎的yuv庫的使用邏輯,但是該項目沒有同步谷歌libyuv更新。

參考鏈接:

https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

http://www.360doc.com/content/16/0517/16/496343_559909505.shtml

谷歌git libyuv

[安卓libyuvDemo

⑺ 如何RGB幀轉換為YUV在Android中使用GPU

幀數與CPU&GPU有關,就和電腦一樣,CPU主頻越高幀數越高,且不會遞減,GPU越高幀數也越高,但是有閥值 所以,在GPU和CPU相同的起始情況下,CPU的提升比GPU的提升效果更明顯 RAM的話主要是保持幀數,與幀數高低無關。也就是RAM不夠可能會在運行的時候大卡一下,RAM足夠支持的時候,就算提升了也沒什麼變化

⑻ 【道聽途說】Android如何直接顯示FFMpeg解碼後的yuv數據

一般的編譯會編譯各種編解碼器,這樣編譯後的so文件就會有6.0MB左右。 ...也遇到同樣問題,幫樓主頂一下。 ...

⑼ android yuv旋轉耗時嚴重怎麼解決

void CTool::YUV420spRotate90(uchar *des, uchar *src,int width,int height)
{
int wh = width * height;
//旋轉Y
int k = 0;
for(int i = 0; i < width; i++) {
for(int j = 0; j < height; j++)
{
des[k] = src[width * j + i];
k++;
}
}

for(int i = 0; i < width; i += 2) {
for(int j = 0; j < height / 2; j++)
{
des[k] = src[wh+ width * j + i];
des[k+1] = src[wh + width * j + i + 1];
k+=2;
}
}
}

在android上運行了一下,發現視頻非常卡。所以只有自己優化了。這段代碼里有乘法,優化的重點就是去掉乘法用加法代替:
[cpp] view plain
void CTool::YUV420spRotate90(uchar *dst, const uchar *src, int srcWidth, int srcHeight)
{
static int nWidth = 0, nHeight = 0;
static int wh = 0;
static int uvHeight = 0;
if(srcWidth != nWidth || srcHeight != nHeight)
{
nWidth = srcWidth;
nHeight = srcHeight;
wh = srcWidth * srcHeight;
uvHeight = srcHeight >> 1;//uvHeight = height / 2
}

//旋轉Y
int k = 0;
for(int i = 0; i < srcWidth; i++) {
int nPos = 0;
for(int j = 0; j < srcHeight; j++) {
dst[k] = src[nPos + i];
k++;
nPos += srcWidth;
}
}

for(int i = 0; i < srcWidth; i+=2){
int nPos = wh;
for(int j = 0; j < uvHeight; j++) {
dst[k] = src[nPos + i];
dst[k + 1] = src[nPos + i + 1];
k += 2;
nPos += srcWidth;
}
}
return;

熱點內容
編程畫櫻花 發布:2024-03-29 02:11:24 瀏覽:471
騰訊雲伺服器1mb老掉線 發布:2024-03-29 01:56:11 瀏覽:213
執行sql語句的存儲過程 發布:2024-03-29 01:52:37 瀏覽:695
婚紗攝影腳本 發布:2024-03-29 01:47:40 瀏覽:899
我的世界伺服器咋開外掛 發布:2024-03-29 01:07:45 瀏覽:455
sql寫報表 發布:2024-03-29 01:03:23 瀏覽:305
家用伺服器怎麼選 發布:2024-03-29 00:49:18 瀏覽:401
Ap6510dn如何配置 發布:2024-03-29 00:38:47 瀏覽:333
安卓和蘋果哪個更佔用內存 發布:2024-03-29 00:37:02 瀏覽:424
編譯錯誤算bug嗎 發布:2024-03-29 00:23:03 瀏覽:34