1,安卓手機在哪里打開gpu硬解碼
不同的手機設(shè)置方式不一樣,試試開發(fā)者選項能否打開!如果是視頻解碼,播放器會自動選擇軟解或者硬解!
2,手機 軟解碼和硬解碼 解惑
為了節(jié)約存儲空間,我們在設(shè)備上播放的視頻文件都是經(jīng)過壓縮的;在播放過程,需要進行一個反射的解壓縮過程,這就是 解碼 軟解碼的解碼過程完全由 cpu 完成的,所以 對 cpu 的性能要求非常高 。如果 cpu 性能不行, 解碼速度跟不上,那我們所看到的畫面就是不流暢、有卡頓的,以當前市場的手機設(shè)備,軟解 4k 的視頻,就非常明顯看到這種現(xiàn)象。同時,由于 cpu 是非常耗電的, cpu 的使用率越高, 耗電量越高, 所以 軟解碼是非常耗電的 。 而硬解碼是通過 gpu 等類似具備 圖形處理功能的芯片完成解碼過程,而 gpu 是基于大的吞吐量、并發(fā)計算設(shè)計,對數(shù)據(jù)相關(guān)性不大的重復(fù)運算,有時加速比能達到幾百倍甚至更高,所以, 使用 gpu 實現(xiàn)視頻解碼, 速度遠快于軟解碼 。 另外,gpu 耗電量是遠小于 gpu ,所以 硬解碼耗電量是非常小的 。 但由于,gpu 本身限于 gpu 開發(fā)平臺,只能對 gpu 本身支持的編碼格式才能進行解碼,所以只有 符合硬解的編碼格式的視頻才能使用硬解碼 ,例如 h264 格式。 軟解碼 硬解碼 這里舉例的視頻是 【720p】 ,所以比較并不是很明顯。 不過,還是可以看出硬解碼比軟解碼對 cpu 的使用率小很多: 同時,幀率硬解碼比軟解碼要高很多,也意味著硬解畫面會更流暢: 建議: 對于符合硬解碼的編碼格式,例如【h264】,采用【硬解碼】進行解碼;不符合硬解碼的編碼格式視頻,才采用軟解碼 。 這樣,不僅僅降低對 cpu 的負荷,讓畫面更流暢,還大大降低耗電量。 視頻解碼的步驟分為: 首先,無論是 硬件解碼 還是 軟件解碼 ,所進行的解碼過程和解碼結(jié)果都是完全一樣的。 他們的 區(qū)別 就是視頻解碼的工作是由 cpu 完成,還是由 gpu 來完成而已。 因此, 在理論上硬件解碼和軟件解碼的效果應(yīng)該是完全一樣的 。 但在最后一個解碼步驟 postproc ( 顯示后處理,解碼去塊濾波操作 deblocking ) 。 deblocking 的意思為解碼去塊,能夠消除 h.264 壓縮編碼可能產(chǎn)生的馬賽克現(xiàn)象,真實地還原視頻圖像。 deblocking 對 cpu 提出了較高的要求,在 cpu 性能不夠時 , 開啟 gpu 硬件加速就會關(guān)閉解碼去塊濾波操作 (deblocking) ,這時播放一些影片會看到較明顯的馬賽克現(xiàn)象,明顯影響畫面質(zhì)量。 換句話說,確實存在, 在 cpu 性能不夠的時候,啟用 硬解碼 ,會關(guān)閉解碼去塊濾波操作 (deblocking) ,明顯影響畫面質(zhì)量 。 但基于當前手機設(shè)備,大多數(shù) cpu 的性能足夠滿足于硬解碼的需求,所以, 出現(xiàn)這種情況的手機設(shè)備必然是低端機、遠次于目前市場的微量手機 。 另外,我們對 ios 和 android 各種機型實際測試中,也未曾發(fā)現(xiàn)開啟硬解后,畫質(zhì)明顯下降的現(xiàn)象。
3,在android 平臺實現(xiàn)硬解的大俠們你們是怎么實現(xiàn)硬解碼的
1、視頻尺寸 一般都能支持176x144/352x288這種尺寸,但是大一些的,640x480就有很多機子不行了,至于為什么,我也不知道。當然,這個尺寸必須和攝像頭預(yù)覽的尺寸一致,預(yù)覽的尺寸可以枚舉一下。2、顏色空間 根據(jù)android sdk文檔,確保所有硬件平臺都支持的顏色,在攝像頭預(yù)覽輸出是yuv12,在編碼器輸入是color_formatyuv420planar,也就是前面代碼中設(shè)置的那樣。 不過,文檔終究是文檔,否則安卓就不是安卓。 在有的平臺上,這兩個顏色格式是一樣的,攝像頭的輸出可以直接作為編碼器的輸入。也有的平臺,兩個是不一樣的,前者就是yuv12,后者等于i420,需要把前者的uv分量顛倒一下。byte[] i420bytes = null; private byte[] swapyv12toi420(byte[] yv12bytes, int width, int height) if (i420bytes == null) i420bytes = new byte[yv12bytes.length]; for (int i = 0; i < width*height; i++) i420bytes[i] = yv12bytes[i]; for (int i = width*height; i < width*height + (width/2*height/2); i++) i420bytes[i] = yv12bytes[i + (width/2*height/2)]; for (int i = width*height + (width/2*height/2); i < width*height + 2*(width/2*height/2); i++) i420bytes[i] = yv12bytes[i - (width/2*height/2)]; return i420bytes; } 3、輸入輸出緩沖區(qū)的格式 sdk里并沒有規(guī)定格式,但是,這種情況h264的格式基本上就是附錄b。但是,也有比較有特色的,它就是不帶那個startcode,就是那個0x000001,搞得把他編碼器編出來的東西送給他的解碼器。bytebuffer outputbuffer = outputbuffers[outputbufferindex]; byte[] outdata = new byte[bufferinfo.size + 3]; outputbuffer.get(outdata, 3, bufferinfo.size); if (framelistener != null) if ((outdata[3]==0 && outdata[4]==0 && outdata[5]==1) || (outdata[3]==0 && outdata[4]==0 && outdata[5]==0 && outdata[6]==1)) framelistener.onframe(outdata, 3, outdata.length-3, bufferinfo.flags); } else outdata[0] = 0; outdata[1] = 0; outdata[2] = 1; framelistener.onframe(outdata, 0, outdata.length, bufferinfo.flags); } }