新聞中心
android camera 采集到的數(shù)據(jù)是yuv嗎
是,android camera初始采集到的格式是yuv格式的,圖像繪制的時(shí)候會(huì)轉(zhuǎn)換成rgb格式的。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了貴定免費(fèi)建站歡迎大家使用!
android yuv怎么轉(zhuǎn)換成RGB565?
參數(shù)分別是寬,高,原數(shù)據(jù)指針,轉(zhuǎn)化后的目標(biāo)數(shù)據(jù)指針。
你找的這個(gè)函數(shù)是用C寫(xiě)的,而你的save(byte[]?yuv420,?String?path,?int?width,?int?height,int?quality)是JAVA,因此你要使用JNI?;蛘吣惆裞vt_420p_to_rgb565函數(shù)轉(zhuǎn)成JAVA版。
舉個(gè)例子?使用jni(實(shí)際自己測(cè)試):
cvt_420p_to_rgb565修改為
#ifdef?__cplusplus
extern?"C"?{
#endif
JNIEXPORT?jobjectArray?JNICALL?你的包名_類(lèi)名_cvt420pToRGB565(JNIEnv?*?env,?jobject?obj,jint?width,?jint?height,jcharArray?srcData,jcharArray?dstData);
#ifdef?__cplusplus
};
#endif
JNIEXPORT?jobjectArray?JNICALL?你的包名_類(lèi)名_cvt420pToRGB565(JNIEnv?*?env,?jobject?obj,jint?width,?jint?height,jcharArray?srcData,jcharArray?dstData)
{
unsigned?char?*?src?=(unsigned?char?*)?(env-?GetByteArrayElements(srcData,???0));?
unsigned?char?*?dst?=(unsigned?char?*)?(env-?GetByteArrayElements(dstData,???0));
下面照抄??!
如何在Android上快速顯示yuv數(shù)據(jù)
最近在搞Android方面的視頻處理開(kāi)發(fā),解碼出來(lái)的都是YUV420格式的數(shù)據(jù),如何在surface上高效顯示出來(lái),頗費(fèi)了一點(diǎn)周折,現(xiàn)在總結(jié)一下。
思路1:在java中將Surface指針傳遞到j(luò)ni層,lock之后就可以獲得SurfaceInfo,進(jìn)而取得要顯示的surface格式、高度、寬度,在2.2/2.3版本,surface的Format一般都是RGB565格式,只用做一個(gè)顏色空間的轉(zhuǎn)換,scaler就可以將yuv數(shù)據(jù)顯示出來(lái)。
顏色空間轉(zhuǎn)換和Scaler算是比較耗時(shí)的操作了。如何提高效率,scaler最好能交給android的底層函數(shù)去做,如果有g(shù)pu的,底層函數(shù)直接會(huì)利用gpu,效率非常高,又不占用cpu資源。
思路2:
參考framework中的AwesomePlayer,里面利用AwesomeLocalRenderer/AwesomeRemoteRenderer來(lái)實(shí)現(xiàn)解碼出來(lái)的數(shù)據(jù)顯示,這個(gè)效率應(yīng)該非常高,但是平臺(tái)的關(guān)聯(lián)性會(huì)增加很多。
調(diào)用接口比較簡(jiǎn)單,
首先創(chuàng)建一個(gè)render,
mVideoRenderer = new AwesomeRemoteRenderer(
mClient.interface()-createRenderer(
mISurface, component,
(OMX_COLOR_FORMATTYPE)format,
decodedWidth, decodedHeight,
mVideoWidth, mVideoHeight,
rotationDegrees));
直接調(diào)用render函數(shù)就可以顯示了。
virtual void render(MediaBuffer *buffer) {
void *id;
if (buffer-meta_data()-findPointer(kKeyBufferID, id)) {
mTarget-render((IOMX::buffer_id)id);
}
}
其它的參數(shù)都很容易獲得,關(guān)鍵是buffer_id 怎么獲得?OMXCodec.cpp中有相關(guān)的可以參考。
實(shí)際的效果在我的S510E上跑,效率非常高,幾乎不占用主控cpu資源,很可能都交給dsp和gpu去搞了。
思路3:
參考 camera的方式。由于在第2步已經(jīng)取得了非常好的效果,筆者沒(méi)有做深入研究。
新聞標(biāo)題:androidyuv,Androidyuv420sp轉(zhuǎn)rgb
轉(zhuǎn)載注明:http://fisionsoft.com.cn/article/phgood.html