當前位置:首頁 » 安卓系統 » android視頻介面

android視頻介面

發布時間: 2023-10-13 19:56:26

1. Android原生編解碼介面 MediaCodec 之——完全解析

MediaCodec 是Android 4.1(api 16)版本引入的編解碼介面, Developer 官網 上描述的已經很清楚了。可以配合 中文翻譯 一起看。理解更深刻。

MediaCodec的工作流程:

從上圖可以看出 MediaCodec 架構上採用了2個緩沖區隊列,非同步處理數據,並且使用了一組輸入輸出緩存
你請求或接收到一個空的輸入緩存(input buffer),向其中填充滿數據並將它傳遞給編解碼器處理。編解碼器處理完這些數據並將處理結果輸出至一個空的輸出緩存(output buffer)中。最終,你請求或接收到一個填充了結果數據的輸出緩存(output buffer),使用完其中的數據,並將其釋放給編解碼器再次使用。
具體工作如下:

MediaCodec的基本調用流程是:

1.初始化MediaCodec,方法有兩種,分別是通過名稱和類型來創建,對應的方法為:

2.配置編碼器,設置各種編碼器參數(MediaFormat),這個類包含了比特率、幀率、關鍵幀間隔時間等。然後再調用 mMediaCodec .configure,對於 API 19 以上的系統,我們可以選擇 Surface 輸入:mMediaCodec .createInputSurface,

3.打開編碼器,獲取輸入輸出緩沖區

獲取輸入輸出緩沖區在api19 上是以上方式獲取,api21以後 可以使用直接獲取ByteBuffer

4.輸入數據,有2種方式,一種是普通輸入,一種是Surface 輸入
普通輸入又可區分為兩種情況,一種是配合MediaExtractor ,一種是取原數據;

返回一個填充了有效數據的input buffer的索引,如果沒有可用的buffer則返回-1,參數為超時時間(TIMES_OUT),單位是微秒,當timeoutUs==0時,該方法立即返回;當timeoutUs<0時,無限期地等待一個可用的input buffer,當timeoutUs>0時,
等待時間為傳入的微秒值。

上面輸入緩存的index,通過getInputBuffers()得到的是輸入緩存數組,通過index和輸入緩存數組可以得到當前請求的輸入緩存,在使用之前要clear一下,避免之前的緩存數據影響當前數據,接著就是把數據添加到輸入緩存中,並調用queueInputBuffer(...)把緩存數據入隊;

5.輸出數據
通常編碼傳輸時每個關鍵幀頭部都需要帶上編碼配置數據(PPS,SPS),但 MediaCodec 會在首次輸出時專門輸出編碼配置數據,後面的關鍵幀里是不攜帶這些數據的,所以需要我們手動做一個拼接;

6.使用完MediaCodec後釋放資源
要告知編碼器我們要結束編碼,Surface 輸入的話調用 mMediaCodec .signalEndOfInputStream,普通輸入則可以為在 queueInputBuffer 時指定 MediaCodec.BUFFER_FLAG_END_OF_STREAM 這個 flag;告知編碼器後我們就可以等到編碼器輸出的 buffer 帶著 MediaCodec.BUFFER_FLAG_END_OF_STREAM 這個 flag 了,等到之後我們調用 mMediaCodec .release 銷毀編碼器

流控就是流量控制。 為什麼要控制,就是為了在一定的限制條件下,收益最大化!
涉及到了 TCP 和視頻編碼:
對 TCP 來說就是控制單位時間內發送數據包的數據量,對編碼來說就是控制單位時間內輸出數據的數據量。

TCP 的限制條件是網路帶寬,流控就是在避免造成或者加劇網路擁塞的前提下,盡可能利用網路帶寬。帶寬夠、網路好,我們就加快速度發送數據包,出現了延遲增大、丟包之後,就放慢發包的速度(因為繼續高速發包,可能會加劇網路擁塞,反而發得更慢)。

視頻編碼的限制條件最初是解碼器的能力,碼率太高就會無法解碼,後來隨著 codec 的發展,解碼能力不再是瓶頸,限制條件變成了傳輸帶寬/文件大小,我們希望在控制數據量的前提下,畫面質量盡可能高。
一般編碼器都可以設置一個目標碼率,但編碼器的實際輸出碼率不會完全符合設置,因為在編碼過程中實際可以控制的並不是最終輸出的碼率,而是編碼過程中的一個量化參數(Quantization Parameter,QP),它和碼率並沒有固定的關系,而是取決於圖像內容。 這一點不在這里展開,感興趣的朋友可以閱讀視頻壓縮編碼和音頻壓縮編碼的基本原理。

無論是要發送的 TCP 數據包,還是要編碼的圖像,都可能出現「尖峰」,也就是短時間內出現較大的數據量。TCP 面對尖峰,可以選擇不為所動(尤其是網路已經擁塞的時候),這沒有太大的問題,但如果視頻編碼也對尖峰不為所動,那圖像質量就會大打折扣了。如果有幾幀數據量特別大,但仍要把碼率控制在原來的水平,那勢必要損失更多的信息,因此圖像失真就會更嚴重。 這種情況通常的表現是畫面出現很多小方塊,看上去像是打了馬賽克一樣,導致畫面的局部或者整體看不清楚的情況

配置時指定目標碼率和碼率控制模式:

碼率控制模式有三種:
碼率控制模式在 MediaCodecInfo.EncoderCapabilities 類中定義了三種,在 framework 層有另一套名字和它們的值一一對應:

動態調整目標碼率:

Android 流控策略選擇

下面展示使用MediaExtractor獲取數據後,用MediaMuxer重新寫成一個MP4文件的簡單栗子

2. 安卓插口有幾種

安岩陸察卓插口有4種,分別是:MIcrousb介面、Type-c介面、30pin介面、lightning介面。

數據線(datacable),其作用是來連接移動設備和電腦的,來達到數據傳遞或通信目的。通俗點說,就是連接電腦與移動設備用來傳送視頻、鈴聲、圖片等文件的通路工具。現在,隨著電子行業日新月異的發展,數據線已經成為了我們生活中不可或缺的部分。一般數據線很少有專用的,普遍現象是一條數據線可以通用多種手機型號,有些型號粗茄的數據線比較誇張,一條線可以用30-40種不同類型的手機。數據線銷售商普遍碰到的問題就是客戶反映數據線不能用,如果你確定發貨沒發錯,多數是客戶不會用數據線了。首先看一下光碟裡面的軟體悉棚是否支持客戶的手機型號,如果不支持就可以去網上下載一個對應的軟體了,這樣一般問題就解決了。關鍵一點:數據線是通用的,軟體不通用。

熱點內容
安卓手機怎麼聯系汽車 發布:2024-11-30 14:12:00 瀏覽:648
python代碼性能 發布:2024-11-30 14:11:57 瀏覽:678
php變數是否存在 發布:2024-11-30 13:53:00 瀏覽:954
數組下標過大編譯錯誤嗎 發布:2024-11-30 13:52:51 瀏覽:639
檢測5g信號密碼是多少 發布:2024-11-30 13:52:51 瀏覽:258
c語言實現復數運算 發布:2024-11-30 13:30:17 瀏覽:768
安卓手機要怎麼下載突擊隊ol 發布:2024-11-30 13:03:42 瀏覽:637
修改密碼sql語句 發布:2024-11-30 12:54:54 瀏覽:156
搭建手游用什麼伺服器 發布:2024-11-30 12:54:09 瀏覽:171
四川密碼門鎖在哪裡買 發布:2024-11-30 12:50:29 瀏覽:401