關於視頻流媒體播放器EasyPlayer-RTSP的渲染,其實有很多東西我們都需要進行比較深入的研究,我們目前使用的渲染就是通過硬解碼之後,分解YUV渲染。本文我們來聊一下EasyPlayer-RTSP渲染問題中ByteBuffer轉換問題。
我們先來解釋一下什麼叫堆外內存:
堆外內存是相對於堆內內存的一個概念。堆內內存是由JVM所管控的Java進程內存,我們平時在Java中創建的對象都處於堆內內存中,並且它們遵循JVM的內存管理機制,JVM會採用垃圾回收機制統一管理它們的內存。那麼堆外內存就是存在於JVM管控之外的一塊內存區域,因此它是不受JVM的管控。
ByteBuffer.allocateDirect(int capacity)是不使用JVM堆棧而是通過操作系統來創建內存塊用作緩衝區,它與當前操作系統能夠更好的耦合,因此能進一步提高I/O操作速度。但是分配直接緩衝區的系統開銷很大,因此只有在緩衝區較大並長期存在,或者需要經常重用時,才使用這種緩衝區。
put(byte[] src, int offset, int length)
從src數組中的offset到offset+length區域讀取數據並使用相對寫入此byteBuffer
clear()
設置position = 0;limit = capacity;mark = -1; 即初始化。
獲取的ByteBuffer需要先轉成byte[],經過JNIUtil.yuvConvert後,再轉成ByteBuffer渲染。