導航:首頁 > 操作系統 > androidcamerayuv

androidcamerayuv

發布時間:2023-05-30 15:40:34

android camera 採集到的數據是yuv嗎

是,android camera初始採集到的格式是yuv格式的,圖像繪制的時候會轉換成rgb格式的。

Ⅱ Android Camera提取出來的yuv420源數據怎麼提取y,u,v分量

Camera默認的預覽格式是 NV21,4:2:0 結構的,每個U、V用於4個Y
參考下下面的代碼
**
* Converts YUV420 NV21 to ARGB8888
*
* @param data byte array on YUV420 NV21 format.
* @param width pixels width
* @param height pixels height
* @retur a ARGB8888 pixels int array. Where each int is a pixels ARGB.
*/
public static int[] convertYUV420_NV21toARGB8888(byte [] data, int width, int height) {
int size = width*height;
int offset = size;
int[] pixels = new int[size];
int u, v, y1, y2, y3, y4;

// i along Y and the final pixels
// k along pixels U and V
for(int i=0, k=0; i < size; i+=2, k+=1) {
y1 = data[i ]&0xff;
y2 = data[i+1]&0xff;
y3 = data[width+i ]&0xff;
y4 = data[width+i+1]&0xff;

v = data[offset+k ]&0xff;
u = data[offset+k+1]&0xff;
v = v-128;
u = u-128;

pixels[i ] = convertYUVtoARGB(y1, u, v);
pixels[i+1] = convertYUVtoARGB(y2, u, v);
pixels[width+i ] = convertYUVtoARGB(y3, u, v);
pixels[width+i+1] = convertYUVtoARGB(y4, u, v);

if (i!=0 && (i+2)%width==0)
i+=width;
}

return pixels;
}

private static int convertYUVtoARGB(int y, int u, int v) {
int r,g,b;

r = y + (int)(1.402f*u);
g = y - (int)(0.344f*v + 0.714f*u);
b = y + (int)(1.772f*v);
r = r>255? 255 : r<0 ? 0 : r;
g = g>255? 255 : g<0 ? 0 : g;
b = b>255? 255 : b<0 ? 0 : b;
return 0xff000000 | (r<<16) | (g<<8) | b;
}

Ⅲ Android Camera提取出來的yuv源數據怎麼提取y,u,v分量

Android
camera採集到的可以是yuv420sp也可以食yuv420p。我知道yuv420中yuv的分布。現在主要有個前提是從Android
Camera
中採集到的yuv420數據,這個byte[]的長度是一倍的視頻寬高乘積,不是1.5倍。在jni裡面獲取到的長度又確實是1.5倍,但是在jni裡面轉換為jbyte*
的長度還是1倍,就不知道怎麼弄了~
查看原帖>>

Ⅳ 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 Camera2 教程 · 第一章 · 概覽

從 Android 5.0 開始,Google 引入了一套全新的相機框架 Camera2(android.hardware.camera2)並且廢棄了舊的相機框架 Camera1(android.hardware.Camera)。作為一個專門從事相機應用開發的開發者來說,這一刻我等了太久了,Camera1 那寥寥無幾的 API 和極差的靈活性早已不能滿足日益復雜的相機功能開發。Camera2 的出現給相機應用程序帶來了巨大的變革,因為它的目的是為了給應用層提供更多的相機控制許可權,從而構建出更高質量的相機應用程序。本文是 Camera2 教程的開篇作,本章將介紹以下幾個內容:

Camera2 的 API 模型被設計成一個 Pipeline(管道),它按順序處理每一幀的請求並返回請求結果給客戶端。下面這張來自官方的圖展示了 Pipeline 的工作流程,我們會通過一個簡單的例子詳細解釋這張圖。

為了解釋上面的示意圖,假設我們想要同時拍攝兩張不同尺寸的圖片,並且在拍攝的過程中閃光燈必須亮起來。整個拍攝流程如下:

一個新的 CaptureRequest 會被放入一個被稱作 Pending Request Queue 的隊列中等待被執行,當 In-Flight Capture Queue 隊列空閑的時候就會從 Pending Request Queue 獲取若干個待處理的 CaptureRequest,並且根據每一個 CaptureRequest 的配置進行 Capture 操作。最後我們從不同尺寸的 Surface 中獲取圖片數據並且還會得到一個包含了很多與本次拍照相關的信息的 CaptureResult,流程結束。

相機功能的強大與否和硬體息息相關,不同廠商對 Camera2 的支持程度也不同,所以 Camera2 定義了一個叫做 Supported Hardware Level 的重要概念,其作用是將不同設備上的 Camera2 根據功能的支持情況劃分成多個不同級別以便開發者能夠大概了解當前設備上 Camera2 的支持情況。截止到 Android P 為止,從低到高一共有 LEGACY、LIMITED、FULL 和 LEVEL_3 四個級別:

相機的所有操作和參數配置最終都是服務於圖像捕獲,例如對焦是為了讓某一個區域的圖像更加清晰,調節曝光補償是為了調節圖像的亮度。因此,在 Camera2 裡面所有的相機操作和參數配置都被抽象成 Capture(捕獲),所以不要簡單的把 Capture 直接理解成是拍照,因為 Capture 操作可能僅僅是為了讓預覽畫面更清晰而進行對焦而已。如果你熟悉 Camera1,那你可能會問 setFlashMode() 在哪? setFocusMode() 在哪? takePicture() 在哪?告訴你,它們都是通過 Capture 來實現的。

Capture 從執行方式上又被細分為【單次模式】、【多次模式】和【重復模式】三種,我們來一一解釋下:

CameraManager 是一個負責查詢和建立相機連接的系統服務,它的功能不多,這里列出幾個 CameraManager 的關鍵功能:

CameraCharacteristics 是一個只讀的相機信息提供者,其內部攜帶大量的相機信息,包括代表相機朝向的 LENS_FACING ;判斷閃光燈是否可用的 FLASH_INFO_AVAILABLE ;獲取所有可用 AE 模式的 CONTROL_AE_AVAILABLE_MODES 等等。如果你對 Camera1 比較熟悉,那麼 CameraCharacteristics 有點像 Camera1 的 Camera.CameraInfo 或者 Camera.Parameters 。

CameraDevice 代表當前連接的相機設備,它的職責有以下四個:

熟悉 Camera1 的人可能會說 CameraDevice 就是 Camera1 的 Camera 類,實則不是,Camera 類幾乎負責了所有相機的操作,而 CameraDevice 的功能則十分的單一,就是只負責建立相機連接的事務,而更加細化的相機操作則交給了稍後會介紹的 CameraCaptureSession。

Surface 是一塊用於填充圖像數據的內存空間,例如你可以使用 SurfaceView 的 Surface 接收每一幀預覽數據用於顯示預覽畫面,也可以使用 ImageReader 的 Surface 接收 JPEG 或 YUV 數據。每一個 Surface 都可以有自己的尺寸和數據格式,你可以從 CameraCharacteristics 獲取某一個數據格式支持的尺寸列表。

CameraCaptureSession 實際上就是配置了目標 Surface 的 Pipeline 實例,我們在使用相機功能之前必須先創建 CameraCaptureSession 實例。一個 CameraDevice 一次只能開啟一個 CameraCaptureSession,絕大部分的相機操作都是通過向 CameraCaptureSession 提交一個 Capture 請求實現的,例如拍照、連拍、設置閃光燈模式、觸摸對焦、顯示預覽畫面等等。

CaptureRequest 是向 CameraCaptureSession 提交 Capture 請求時的信息載體,其內部包括了本次 Capture 的參數配置和接收圖像數據的 Surface。CaptureRequest 可以配置的信息非常多,包括圖像格式、圖像解析度、感測器控制、閃光燈控制、3A 控制等等,可以說絕大部分的相機參數都是通過 CaptureRequest 配置的。值得注意的是每一個 CaptureRequest 表示一幀畫面的操作,這意味著你可以精確控制每一幀的 Capture 操作。

CaptureResult 是每一次 Capture 操作的結果,裡麵包括了很多狀態信息,包括閃光燈狀態、對焦狀態、時間戳等等。例如你可以在拍照完成的時候,通過 CaptureResult 獲取本次拍照時的對焦狀態和時間戳。需要注意的是,CaptureResult 並不包含任何圖像數據,前面我們在介紹 Surface 的時候說了,圖像數據都是從 Surface 獲取的。

如果要我給出強有力的理由解釋為什麼要使用 Camera2,那麼通過 Camera2 提供的高級特性可以構建出更加高質量的相機應用程序應該是最佳理由了。

如果你熟悉 Camera1,並且打算從 Camera1 遷移到 Camera2 的話,希望以下幾個建議可以對你起到幫助:

本章到此結束,主要是介紹了 Camera2 的一些基礎概念,讓大家能夠基本了解 Camera2 的工作流程和基礎概念,並且知道使用 Camera2 能夠做些什麼。如果你對 Camera2 還是感到很陌生,不要緊,後續的教程會帶領大家逐步深入了解 Camera2。

Ⅵ android 中如何將camera獲取的YUV420SP原始數據當視頻播放

手機自帶的播放器即可

閱讀全文

與androidcamerayuv相關的資料

熱點內容
linux內存子系統 瀏覽:968
加密思維幣 瀏覽:688
魅族訪客文件夾 瀏覽:50
添加的文件夾怎麼找 瀏覽:615
程序員涉黃 瀏覽:698
maven編譯resources下的js 瀏覽:519
ubuntu文件移動命令 瀏覽:227
安卓i怎麼查找蘋果手機 瀏覽:949
雲伺服器宕機概率 瀏覽:231
在線買葯用什麼app知乎 瀏覽:813
ubuntu解壓xz文件 瀏覽:675
宏傑加密時電腦關機 瀏覽:389
自己寫單片機編譯器 瀏覽:599
單片機按鍵閃爍 瀏覽:382
為什麼icloud總是顯連接伺服器失敗 瀏覽:890
如何設置域控伺服器 瀏覽:740
想在上海租房子什麼app好 瀏覽:186
編譯程序各部分是必不可少的嗎 瀏覽:887
編程不超過十行 瀏覽:765
數電編譯器的作用 瀏覽:339