Ⅰ android 怎麼判斷camera是否開啟預覽
雜家前文是在2012年的除夕之夜倉促完成,後來很多人指出了一些問題,瑣事纏身一直沒有進行升級。後來隨著我自己的使用,越來越發現不出個升級版的demo是不行了。有時候就連我自己用這個demo測一些性能、功能點,用著都不順手。當初代碼是在linux下寫的,弄到windows里下全是亂碼。還要自己改幾分鍾才能改好。另外,很多人說不能正常預覽,原因是我在布局裡把Surfaceview的尺寸寫死了。再有就是initCamera()的時候設參數失敗,直接黑屏退出,原因也是我把預覽尺寸和照片尺寸寫死了。再有就是照片變形的問題。為此,今天出一個升級版的demo,爭取全面適配所有機型。
上圖為此次的代碼結構,activity包里就是放CameraActivity,日後添加圖庫瀏覽功能再加GalleryActivity。為了使Camera的邏輯和界面的UI耦合度降至最低,封裝了CameraInterface類,裡面操作Camera的打開、預覽、拍照、關閉。preview包里是自定義的Surfaceview。在util包里放著CamParaUtil是專門用來設置、列印Camera的PreviewSize、PictureSize、FocusMode的,並能根據Activity傳進來的長寬比(主要是16:9 或 4:3兩種尺寸)自動尋找適配的PreviewSize和PictureSize,消除變形。默認的是全屏,因為一些手機全屏時,屏幕的長寬比不是16:9或4:3所以在找尺寸時也是存在一些偏差的。其中有個值,就是判斷兩個float是否相等,這個參數比較關鍵,裡面設的0.03.經我多個手機測試,這個參數是最合適的,否則的話有些奇葩手機得到的尺寸拍出照片變形。下面上源碼:
Ⅱ Android Camera(二)
CameraManager、CameraDevice、CameraCharacteristics、CameraRequest與CameraRequest.Builder、CameraCaptureSession以及CaptureResult。
1. 開發相機必須的的許可權就是 Manifest.permission.CAMERA 了,所以第一步要在Manifest中添加Camera permission:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" /></pre>
如果是6.0以上的手機還要動態申請許可權,關於許可權這塊大家可以使用PermissionUtil全局管理。
2.獲取CameraManager實例 開啟相機
3.當相機成功打開後會回調onOpened方法,這里可以拿到CameraDevice對象,也就是具體的攝像頭設備
4.設置相機一些參數 包括方向
5.開啟預覽
6.開啟預覽後獲取實時流數據,onImageAvailable回調中的ImageRender獲取實時流數據,這個數據是YUV_420_888的數據 ,我們可以存儲數據也可以對數據流進行美顏濾鏡操作,也可以推送給服務端。
7.當關閉界面或者停止預覽時 :
Ⅲ Android音視頻(六) 使用OpenGL ES 3.0預覽Camera
剛學習了OpenGL的紋理相關知識喚碧,終於可以接著寫Android音視頻系列了。
本篇博客會介紹使用OpenGL ES 3.0相關知識預覽Camera,並且提供Camera和Camera2兩個版本實現。
頂點著色器
片段著色器
紋理的類型需要使用 samplerExternalOES ,而不是之前渲染圖片的 sampler2D。
我們知道Android相機輸出的原始數芹拍據一般都為YUV數據,而在OpenGL中使用的絕大部分紋理ID都是RGBA的格式,所以原始數據都是無法直接用OpenGL ES來渲染的。所以我們添加了一個擴展 #extension GL_OES_EGL_image_external_essl3 : require ,其中定義了嫌鏈羨一個紋理的擴展類型 GL_TEXTURE_EXTERNAL_OES 。後面綁定紋理時需要綁定到 GL_TEXTURE_EXTERNAL_OES 上,而不是類型GL_TEXTURE_2D上。
其實前面部分和載入圖片沒有什麼區別,最後兩行,對應上面流程中的1、2步。創建紋理,綁定外部紋理,然後根據紋理ID創建SurfaceTexture作為相機預覽輸出。
使用Camera2在OpenGL方面其實是一樣的,並沒有什麼改動。所以只需要看一下Camera2的調用就好。
源碼地址
Ⅳ Android 實時視頻採集—Camera預覽採集與顯示(平台系統camera功能理解分享)
本文之所以有必要編寫並作記錄,主要原因是因為在工作中開發出一個萬能的自定義camera預覽控制項之後,本是一個提高效率以及提供一個強大能力的控制項,但是產品並不能理解這個萬能控制項存在的意義,產品無法與技術設計相結合的理解使用;並且發現我們的智能業務部Camera自定義預覽技術雖然是使用多年,但是我們並沒有真正的形成規范,由於產品在不能夠理解系統平台(Android/iOS)給產品和研發帶來了什麼,導致產品可能會出現在不理解系統平台以及系統知識的情況下,臆想產品所謂的形態;當產品設計脫離了系統平台所支持的技術點以及設計的初衷,就會導致回歸問題的時候,出現不必要的討論,其根結就是一點:「信息不同步,知識不同步」。
所以,為了提高效率,就採用記錄和分享的方式,嘗試性推動產品、測試、研發三者對工程與架構的同步理解,更深的懂得程序架構設計意義,嘗試性通過信息同步的方式,在一個統一的知識儲備的平台下,共同完成一個更高效,和高品質的工程產品。(為了能夠讓非技術:產品設計,以及測試都能夠理解,所以,使用了更多的白話解釋)
附:強大靈活的FsCameraTextureView(第一版,自適應截取)( 第二版本版本:自適應展示)
首先,拋出幾個問題,
1)什麼是攝像頭支持的previewSize?
2)什麼是視頻或者圖片的pictureSize?
3) 如何獲取和查看攝像頭支持的PreViewSize 和PictureSize ?
4)手機預覽所見的區域SurfaceView(TextureView)與camera 的previewSize的關系是什麼?
5)為什麼會設計了兩種預覽方式view,兩種預覽方式都會有什麼樣子的效果呢?
一,概述
通過Android Camera拍攝預覽中設置setPreviewCallback實現onPreviewFrame介面,實時截取每一幀視頻流數據(簡單說來,就是通過設置一個介面,接收系統回調通知我們的每一幀數據)
二,知識點
1, camera支持的格式:
2,拍照流程
3,camera許可權
三,Android Camera中PreviewSize、 PictureSize、 SurfaceView(TextureView)之間的關系
1,PreviewSize:
相機預覽時候的能支持的尺寸,簡單的說一下,就是預覽的大小,也就是拍照前能夠看到的圖片大小。(通過Android手機相機可以試一下,這個參數設置不同,同樣的焦距下,拍攝桌子上一個固定距離的東西,看到的視野會不同)
相機的預覽尺寸,不能隨意的設置值,只能通過camera的parameters的getSupportedPreviewSizes方法,獲取支持的預覽尺寸列表,並從列表中選擇一個設置在parameters中。(通俗簡單的說就是,獲取camera中能夠支持的預覽大小合集,如果你想要查看某個預覽對應的尺寸,就把該尺寸設置到camera的屬性中即可,則camera會返回相對應尺寸的預覽數據流提供顯示)。
2,PictureSize :
指的是拍照之後,最終拍攝到的圖片大小,也就是圖片的質量。圖片尺寸同樣也只能從支持的列表中選取一個設置。 調用camera的takePicture方法(拍照)後,獲得拍照的圖像數據,注意picturesize和previewsize的寬高比也要保證一致,否則獲取的圖片會將preview時的圖像裁剪成picturesize的比例。 previewsize的解析度,只會影響預覽時的解析度,不會影響獲取圖片的解析度,所以preview只是確定了圖像的取景最大范圍。最終圖片的解析度是由picturesize來決定。 所以,最好的設置方法,例如:previewsize為1280*720,picturesize為2560*1440。(由於我們沒有拍照業務,目前這個知識,不做深究)
3,SurfaceView(TextureView)
用於展示camera預覽圖像的view,就是將preview獲得的數據,放在這個view上。所以如果preview的寬高比和SurfaceView的寬高比不一樣,就會導致看到的圖像拉伸變形。圖像拉伸變形解決的辦法:
(1)就是在確定preview的解析度後,重新設置SurfaceView寬高;
(2)如果SurfaceView寬高定死,則需要獲取一個比例適合SurfaceView尺寸的PreviewSize 的preview,盡量小的裁剪,然後填充在SurfaceView中。
4,利用圖片的顯示方式,理解Preview與SurfaceView(TextureView)顯示關系
ImageView (UI上面設計的一個控制項)與圖片bitmap 的關系,比如限定死一個ImageView的大小,但是圖片與ImageView尺寸不一致,就會有幾種方案,首先選取一張長方形1920*1080的圖片,ImageView就是紫色部分,無論長寬比都比ImageView要大。
圖片適配例1:拉伸填充ScaleType.FIT_XY :雖然被全部填充,但是整個圖片為了適配圖片已經扭曲,失真,圖片縮放到控制項大小,完全填充控制項大小展示。
圖片適配例2:等比例裁剪填充ScaleType.CENTER_CROP ,因為在該模式下,圖片會被等比縮放直到完全填充整個ImageView,並居中顯示。該模式也是最常用的模式了。如圖可以看到,圖片的高度是能完全展示出來的,但是左右部分被進行了裁剪,並沒有完全顯示。
圖片適配例3 : ScaleType.CENTER_INSIDE,此模式,用以完全展示圖片內容為目的。圖片將被等比縮放到能夠完整展示在ImageView中並居中,如果圖片大小,小於控制項尺寸,那麼就直接居中展示該圖片
圖片適配ImageView方式還有很多,就不一一列舉,這三種已經足夠重要,為什麼講解camera預覽,卻穿插了圖片的適配,其實可以這么理解,camera的preview就是由多張圖片組成,不斷的像幀動畫一樣變化,而SurfaceView就是一個載體,相當於ImageView,業務中定死了SurfaceView的大小之後,被動的承載你選擇的previewSize,來展示camera的Preview,你可以選擇類似於前面三種例子來理解preview的填充,以下會舉例說明preview的填充策略選擇有哪幾種方式,我們會採用哪種方式:
1)拉伸填充,自適應view,不可取,比如:手機的SurfaceView是整個手機的屏幕尺寸(全屏填充),或者任意尺寸比例的surfaceView,使用這種方式,就如同(圖片適配例1)的方式,導致視頻扭曲,拉伸。
2)等比例裁剪填充,目前我們項目中,採用的就是這種方式,並且提供給很多三方使用,已經成為一種獨立,並且穩定的技術實現自定義view,簡單說一下視頻的適配策略方式,SurfaceView隨便由業務方,自定義寬度大小,比如業務方選擇了1900*1000的SurfaceView, 我們的適配過程是:(1)從PreviewSize列表中選取最接近SurfaceView尺寸的PreviewSize(假設該攝像頭,只支持1920*1080,和320*640),1920*1080最接近,所以被獲取;(此處展示一下蹩腳的英文Try to find an size match aspect ratio and size,嘗試找到縱橫比與view大小比適中的一個尺寸)(2)等比例裁剪填充到SurfaceView,首先我們設計的邏輯是,先選取一個縮放比例,假設等比例1920的圖片按照SurfaceView的寬度等比例縮小到1900,而為了不讓Preview失真,則高度1080等比例縮小的值是1068.75(等比例方程式,這里就不重復初中的知識,請自行計算),所以圖片被壓縮成為1900*1068這個尺寸,依舊保證圖片完整,並且不失真。(3)將等比例縮減的圖片,1900*1068進行顯示在1900*1000的SurfaceView中,就會有一種效果類似(圖片適配例2),寬度全部展示,高度被裁剪。(如同 圖片適配例2中左右部分裁剪一樣的道理)
3)完全展示camera內容的縮放填充(類似圖片適配例3),我們打開任意一部手機的camera,預覽圖像都沒有全屏幕展示,類似拍照功能,所見即所得,PreviewSize是多少,就顯示什麼樣子的比例尺寸,以及最後生產的照片比例就是多少,我們的自定義view,也可以隨意設置大小,此模式下,用以完全展示camera內容為目的。Preview將被等比縮放到能夠完整展示在SurfaceView中並居中,但是可能會有部分位置無法填充(類似圖片適配例3顯示效果)。
(該方式只是進行了技術儲備,由於沒有業務場景設計,所以沒有使用,目前只是儲備了這樣的自定義控制項)
四,靈活的自定義TextureView預覽控制項
FsCameraTextureView(第一版,自適應截取):等比例裁剪填充,方式(適配方式2),採用前面說的適配方式2,而產出的一種自定義view,2019年5月產出至今,在金融APP,以及商城的app中使用,經過逐步優化,和多版本檢驗,目前該控制項,擁有以下特點: 1)穩定:目前各個使用場景,均無邏輯崩潰,內存泄漏,線程等任意問題; 2)靈活:隨意設置預覽view的尺寸大小,自適應任意業務設計;不僅僅滿足刷臉業務,並且滿足任意相機預覽業務方使用; 3)提高效率,減輕工作量:使用簡單,操作步驟簡潔,接入只需要兩步;減輕接入端,或者想要使用相機預覽的業務的工作量,不需要重復造車,並且安全穩定。
輸出的業務方有(經不完全統計):(目前業務為保密進行公網保密處理)1)**創新科技業務部-區塊鏈部門 2)泰國人臉識別業務SDK3)S D**Bank 人臉業務4)核驗身份證業務5)HT**Bank 人臉業務 6)**雲,商業平台部門
FsAllPreviewCameraTextureView(技術儲備版,全預覽模式顯示):完全展示camera內容的縮放填充,採用前面說的(適配方式3)適合拍照相關的業務使用,優點同樣是,外部業務隨意改變view大小,可以自適應view,由於目前沒有業務方使用,暫時做儲備,不深入講解。
如果可以控制項開源成功,後期,我將開源這兩個控制項,讓更多的使用方使用,我們也希望共同技術進步,提高工程產出的使用能力。
預計下一次分享內容是(臨時命名)
1)人臉核驗內存和線程爆表到泄漏為零
2)分享七年前參於的Scrum(如何提高崗位間效率所定製的敏捷開發過程)
本文參考:
https://www.jianshu.com/p/32e335d5b842
https://www.cnblogs.com/skyseraph/archive/2012/03/26/2418665.html
Ⅳ Android Camera開發系列:調整Camera預覽方向
有時候我們想根據自己的需要調整下Camera的預覽方向,那麼是調用哪個API可以達到我們的目的呢?
我們看下下圖拍的幾張小可愛的照片,分別是正常方向、旋轉180度、90度拍的照片。
Camera1上,我們可以通過 setDisplayOrientation(int degress); 來設置camera預覽的方向。
這里也貼下源碼裡面關於setDisplayOrientaion介面的詳細說明。
Camera2的API上,找了一通,發現並沒有像Camera1上,可以通過類似的介面來設置預覽方向,不過可以通過TextureView.setTransform(matrix);來通過調整textureView的顯示來達到目的。
Ⅵ Android 自定義相機 Camera 預覽變形拉伸問題
首先要想不變形拉伸要保證三點一定要一樣:
1.預覽View的尺寸;
2.選取合適的預覽解析度;
3.選取相機支持的圖片尺寸;
上面兩個方法返回大致坦孝是如下:
後補。。。
方法一 :這個方案簡單粗暴,我們市面上所有手機基本都會支持兩種解析度4:3 / 16:9,我所瀏覽的區域選取4:3方法如下:
方法二 :目前提供一下思路後續具體提供內容;
此方法就是算出需求比褲清例最相近的尺寸使用,然後設置預覽View寬高,如有其他好的方案希望可以讓純稿共同學習一下;
Ⅶ android camera開始預覽以後 數據時怎麼刷到surfaceview上面的
數據是通過感光塗層所顯示的圖像數據來刷到surfaceview上面的。
數字相機是一種新型的圖像輸入設備,它與傳統照相機的原理相同,是根據物體離開凸透鏡的距離大於兩倍焦距時,凸透鏡悉悶成倒立縮小的實像的原理製成的,只是它把外界物體的實像感光到睜雹照相機內部的感光晶元上,經過數字處理後,直接存睜早彎儲到照相機的存儲媒介上,並可以直接連接到電腦上使用。