1. 程式人生 > >Android SurfaceTexture和GLSurfaceView做Camera預覽

Android SurfaceTexture和GLSurfaceView做Camera預覽

GLSurfaceView是OpenGL中的一個類,也是可以預覽Camera的,而且在預覽Camera上有其獨到之處。獨到之處在哪?當使用Surfaceview無能為力、痛不欲生時就只有使用GLSurfaceView了,它能夠真正做到讓Camera的資料和顯示分離,所以搞明白了這個,像Camera只開預覽不顯示這都是小菜,妥妥的。Android4.0的自帶Camera原始碼是用SurfaceView預覽的,但到了4.2就換成了GLSurfaceView來預覽。如今到了4.4又用了自家的TextureView,所以從中可以窺探出新增TextureView的用意。

雖說Android4.2的Camera原始碼是用GLSurfaceView預覽的,但是進行了大量的封裝又封裝的,由於是OpenGL小白,真是看的不知所云。俺滴要求不高,只想弄個可拍照的摸清GLSurfaceView在預覽Camera上的使用流程。經過一番百度一無所獲,後來翻出去Google一大圈也沒發現可用的。倒是很多人都在用GLSurfaceView和Surfaceview同時預覽Camera,Surfaceview用來預覽資料,在上面又鋪了一層GLSurfaceView繪製一些資訊。無奈自己摸索,整出來的是能拍照也能得到資料,但是介面上不是一塊白板就是一塊黑板啥都不顯示。後來在stackoverflow終於找到了一個可用的

連結,哈哈,蒼天啊,終於柳暗花明了!參考此連結,自己又改改摸索了一天才徹底搞定。之所以費這麼多時間是不明白OpenGL ES2.0的繪製基本流程,跟簡單的OpenGL的繪製還是稍有區別。下面上原始碼:

一、CameraGLSurfaceView.java 此類繼承GLSurfaceView,並實現了兩個介面

[java] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. <span style="font-family:Comic Sans MS;font-size:18px;">package org.yanzi.camera.preview;  
  2. import javax.microedition.khronos.egl.EGLConfig;  
  3. import javax.microedition.khronos.opengles.GL10;  
  4. import org.yanzi.camera.CameraInterface;  
  5. import android.content.Context;  
  6. import android.graphics.SurfaceTexture;  
  7. import android.opengl.GLES11Ext;  
  8. import android.opengl.GLES20;  
  9. import
     android.opengl.GLSurfaceView;  
  10. import android.opengl.GLSurfaceView.Renderer;  
  11. import android.util.AttributeSet;  
  12. import android.util.Log;  
  13. publicclass CameraGLSurfaceView extends GLSurfaceView implements Renderer, SurfaceTexture.OnFrameAvailableListener {  
  14.     privatestaticfinal String TAG = "yanzi";  
  15.     Context mContext;  
  16.     SurfaceTexture mSurface;  
  17.     int mTextureID = -1;  
  18.     DirectDrawer mDirectDrawer;  
  19.     public CameraGLSurfaceView(Context context, AttributeSet attrs) {  
  20.         super(context, attrs);  
  21.         // TODO Auto-generated constructor stub
  22.         mContext = context;  
  23.         setEGLContextClientVersion(2);  
  24.         setRenderer(this);  
  25.         setRenderMode(RENDERMODE_WHEN_DIRTY);  
  26.     }  
  27.     @Override
  28.     publicvoid onSurfaceCreated(GL10 gl, EGLConfig config) {  
  29.         // TODO Auto-generated method stub
  30.         Log.i(TAG, "onSurfaceCreated...");  
  31.         mTextureID = createTextureID();  
  32.         mSurface = new SurfaceTexture(mTextureID);  
  33.         mSurface.setOnFrameAvailableListener(this);  
  34.         mDirectDrawer = new DirectDrawer(mTextureID);  
  35. 相關推薦

    Android SurfaceTextureGLSurfaceViewCamera

    GLSurfaceView是OpenGL中的一個類,也是可以預覽Camera的,而且在預覽Camera上有其獨到之處。獨到之處在哪?當使用Surfaceview無能為力、痛不欲生時就只有使用GLSurfaceView了,它能夠真正做到讓Camera的資料和顯示分離,所

    Android平臺Camera實時濾鏡實現方法探討(五)--GLSurfaceView實現Camera

    前面有一篇探討了如何在片段著色器中將YUV資料轉換為RGB資料並顯示,但採用samplerExternalOES將SurfaceTexture作為OpenGL外部紋理,需要使用GL_TEXTURE_EXTERNAL_OES作為紋理模板,通過SetPreviewTexture

    android平臺下OpenGL ES 3.0使用GLSurfaceView對相機Camera實時處理

    OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

    android平臺下OpenGL ES 3.0使用TextureView對相機Camera實時處理

    OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

    Camera尺寸獲取螢幕寬高。

    演算法需要將預覽大小與手機的解析度掛鉤,才能夠在不同解析度的手機上面預覽都不變形。 /** * 獲取最佳預覽大小 * @param parameters 相機引數 * @param screenResolution 螢幕寬高 * @return */ priva

    Android手勢識別 Camera 介面上顯示文字 佈局注意事項(merge佈局)

    通常在Surfaceview作為預覽視訊幀的載體,有時需在上面顯示提示文字。以前我弄的都好好的,今天忽然發現疊加的TextView不管咋弄都出不來文字了,跟Surfaceview一起放在FrameLayout也不行,後來想到merge佈局,發現也不行。大爺的,奇了怪了,最

    Android camera引數以及實際影象大小設定

    參考一下兩篇博文: ###########################################################333 PreviewSize是預覽的大小,也就是拍照前看到的圖片大小 PictureSize是指最終拍攝到的圖片的大小,也就

    Android Camera時輸出的幀率控制

    如果使用MediaCodec硬編碼H264,可以使用下面的方法控制編碼輸出的幀率: MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);

    Android 5.0 Camera系統原始碼分析(4):Camera流程資料流

    1. 前言 上一篇講了怎麼讓Camera進入預覽模式,提到了DisplayClient負責顯示影象資料,而CamAdapter負責提供影象資料,這裡主要記錄了CamAdapter怎麼獲取影象,然後DisplayClient怎麼將影象顯示在螢幕上。 2.

    Android 5.0 Camera系統原始碼分析(3):Camera流程控制流

    1. 前言 本文分析的是Android系統原始碼,從frameworks層到hal層,記錄了Camera進入預覽模式的重點程式碼,主要為控制流程的程式碼,有關影象buffer的傳遞暫不涉及,硬體平臺基於mt6735。由於某些函式比較複雜,在貼出程式碼時會適當對

    AndroidCamera過程中插拔攝像頭節點後移

    現象: 在使用Camera Preview時;熱插拔攝像頭會導致裝置節點由/dev/video0變為/dev/video1,或者插入多個video裝置時,會變為/dev/video1、/dev/video2......。 一、首先看裝置節點的建立 drivers/media

    Android 使Camera清晰,迴圈自動對焦處理

    我們經常使用SurfaceView顯示Camera預覽畫面,但畫面基本都不清晰。主要是因為沒有自動對焦,而自動對焦觸發是通過mCamera.autoFocus(autoFocusCallback);這個

    Camera 之SurfaceView、TextureView、GLSurfaceView(三)

    今天介紹下GLSurfaceView如何使用。GLSurfaceView的包名是android.opengl,由此可以它是opengl的一個類,它也可以預覽camera,而且在預覽camera上有比SurfaceView獨特的優勢,可以做到資料和顯示的分離,比如在沒有螢幕

    Android音視訊-視訊採集(Camera

    Camera的使用我們直接根據官網介紹的使用流程,然後細入每個環節的內容,完全掌握Camera的使用。 我們最終的Demo在最後貼上,最終的Demo顯示效果如下: 建立Camera應用 我們快速的來顯示一個相機預覽的程式碼 宣告相機許可權和

    Android實現本地圖片選擇及縮放效果仿春雨醫生

    在做專案時經常會遇到選擇本地圖片的需求,以前都是懶得寫直接呼叫系統方法來選擇圖片,但是這樣並不能實現多選效果,最近又遇到了,所以還是寫一個demo好了,以後也方便使用。還是首先來看看效果 顯示的圖片使用RecyclerView實現的,利用Glide來載入;下面彈出的圖片資料夾效果是採用

    Tcl/tk例項-工具欄選單-圖片工具

    可以開啟並檢視圖片,點選工具欄上 Previous 和 Next 按鈕來瀏覽 前/下 一張。僅僅是一個例子,其它按鈕和選單未新增命令。 package require Ttk package require Img package require base64 package require B

    利用FileReaderFormData實現圖片上傳(base64轉二進位制檔案)

    業務有個需求,要做圖片預覽上傳,過去都是客戶端上傳給後端,後端返回 url 前端進行預覽,現在其實可以不依賴後端做預覽,最後在上傳,這主要依賴 FileReader 和 FormData 這兩個物件和 JavaScript 處理二進位制的能力。 OK,Show cod

    Android拍照,上傳,綜合【修改】

    最近需要做手機拍照【兩種方式:呼叫系統相機(部落格最後);自己寫照相機佈局】,預覽,上傳功能。特地研究了下android的手機拍照。 參考地址: http://blog.csdn.net/cfwdl/article/details/5746708 http://mjbb.iteye.co

    android studio 小技巧之 圖片

    直接上圖 android studio  進過幾個小版本的更新     大版本已近來到了2.0    總體來說越來越好了,熟悉以後還是非常好用 , 比eclipse  好用的不是一點兩點 這次帶來      圖片預覽       右擊     drawable資料夾  

    如何Android studio 的佈局XML時介面彈出的Rendering Problems?

    如何Android studio 的佈局XML時預覽介面彈出的Rendering Problems? 問題圖預覽:   點選“Preview”預覽選單欄的“AppTheme”,從彈出的選單框中選