iOS快速將顯卡中數(shù)據(jù)讀出壓縮成視頻-cocos2dx擴展
手機平臺性能是個關鍵問題。
壓縮視頻分成3個步驟:
讀取顯卡數(shù)據(jù), 使用編碼器壓縮,保存文件。
使用libav 壓縮的時候,軟件編碼器效率不夠,在itouch5上面只能做到5-6 fps。
因此使用ios平臺自帶的AVFoundtion庫來做,硬件加速編碼,具體做法參考
http://stackoverflow.com/questions/9661259/record-the-drawing-as-a-m4v-video-file-opengl/9672890#9672890
使用corevideo 庫提供的函數(shù), 在itouch5上能做到12-13fps。
接下來的瓶頸主要在從顯卡中讀取數(shù)據(jù)上面 即glReadPixel
ios 提供一種texturecache 可以將cpu存儲器和顯卡存儲 map到一起,但是就不能像操作cpu存儲一樣方便的改動這塊區(qū)域的數(shù)據(jù)了, 具體硬件機制不是很了解, 但是這樣可以大大降低 消耗的時間,只做獲取數(shù)據(jù) 壓縮視頻任務的話 可以達到60fps的效率。 具體參考
http://stackoverflow.com/questions/9550297/faster-alternative-to-glreadpixels-in-iphone-opengl-es-2-0
這兩個回答是一個人,這位仁兄的項目:
https://github.com/BradLarson/GPUImage
主要參考其中的 MovieWrite 類。
因此要在cocos2dx上面擴展游戲視頻錄制的功能,則需要改動
CCDirector 添加錄制游戲狀態(tài),將當前游戲場景繪制到texture 中
接著將這個texture內(nèi)容繪制到屏幕上用于顯示
接著將這個texutre繪制到 視頻cache 的framebuffer中 用于生成視頻。
這塊的代碼可以參考CCRenderTexture 部分的代碼。