Android 自定義相機(jī) 視頻錄制爬過(guò)的坑

作為一個(gè)專業(yè)的程序員,怎么能少得了技術(shù)的文章呢,詩(shī)云:“胸藏文墨懷若谷,腹有詩(shī)書氣自華”,妥妥的就是一個(gè)翻版的我。明明可以靠顏值,非要靠才華。

前言:

近來(lái)閑來(lái)無(wú)事,總結(jié)了一下之前做過(guò)的經(jīng)典的小案例,最精彩的莫過(guò)于模仿微信的小視頻。公司的需求就是要拍一個(gè)繞車的小視頻,具體的要求就是不超過(guò)三十秒 ,視頻文件大小限制在20M,必不可少是各個(gè)型號(hào)的適配。

嘻嘻在這里具體的demo就不往外貼了,下面主要說(shuō)一下我在這個(gè)項(xiàng)目中遇到的難點(diǎn),其實(shí)主要分為三大塊 1 是黑屏? 2是權(quán)限 3是壓縮

一.黑屏

場(chǎng)景:運(yùn)行的時(shí)候發(fā)現(xiàn),只有第一次進(jìn)入時(shí)錄制界面能成功預(yù)覽,一旦用back按鍵返回或者按home鍵回到主界面,再啟動(dòng)程序的時(shí)候,預(yù)覽界面就變黑了。

定位:黑屏說(shuō)明surfaceview沒有重新繪制。

解決:在界面重新獲取焦點(diǎn)的時(shí)候要重新繪制,在OnResume()方法中開啟一下相機(jī),我是把OnCreate()中的代碼挪了過(guò)來(lái)。在焦點(diǎn)的消失的別忘了在onPause()中關(guān)閉相機(jī)。如果你認(rèn)為這樣簡(jiǎn)簡(jiǎn)單單的就完成那就錯(cuò)了。經(jīng)過(guò)一番測(cè)試,在華為 榮耀 三星S6中還是不行,經(jīng)過(guò)一番的查找資料 ,開啟相機(jī)的時(shí)候做一下延遲,調(diào)用底層so檔的需要時(shí)間。我是延遲了50ms;所以最終解決辦法還需要將上述OnResume()中的開啟相機(jī)方法改成如下:

?try {

????Thread.sleep(50);

?} catch (InterruptedException e) {

?????// TODO Auto-generated catch block

?????e.printStackTrace();

?} ??

二.權(quán)限

場(chǎng)景:在系統(tǒng)版本5.0以下的手機(jī),手機(jī)的權(quán)限是自己去申請(qǐng)的,權(quán)限拒絕的時(shí)候,錄制的動(dòng)畫還在走,并且在魅族手機(jī)上出現(xiàn)了崩潰。

定位: 得到權(quán)限的狀態(tài),沒有權(quán)限的時(shí)候禁止操作。

解決:沒有使用第三方的狀態(tài)庫(kù),因?yàn)轫?xiàng)目偏老。而是用了一個(gè)比較笨而且實(shí)用的方法;針對(duì)權(quán)限:

/**

*? 返回true 表示可以使用? 返回false表示不可以使用

*/

public static boolean cameraIsCanUse() {

????boolean isCanUse =true;

? ? Camera mCamera =null;

? ? try {

????????mCamera = Camera.open();

? ? ? ? Camera.Parameters mParameters = mCamera.getParameters(); //針對(duì)魅族手機(jī)

? ? ? ? ?mCamera.setParameters(mParameters);

? ? }catch (Exception e) {

????????isCanUse =false;

? ? }

????if (mCamera !=null) {

????????try {

????????????mCamera.release();

? ? ? ? }catch (Exception e) {

????????????e.printStackTrace();

? ? ? ? ? ? return isCanUse;

? ? ? ? }

????}

return isCanUse;

}

針對(duì)動(dòng)畫的解決方案是根據(jù)權(quán)限來(lái)判斷,后來(lái)想想了太笨了,根據(jù)onTouch事件來(lái)做的操作,當(dāng)權(quán)限彈出來(lái)的時(shí)候,觸摸的位置已經(jīng)改變,但是手指沒有抬起。onTouch中有四個(gè)狀態(tài),分別是1、ACTION_DOWN:表示按下了屏幕,第一個(gè)執(zhí)行也是必然執(zhí)行的方法。2、ACTION_MOVE:表示為移動(dòng)手勢(shì),會(huì)不斷的執(zhí)行直到觸摸停止。3、ACTION_UP?:表示為離開屏幕,觸摸停止的時(shí)候執(zhí)行。4、ACTION_CANCEL:表示取消手勢(shì),不會(huì)由用戶產(chǎn)生,而是由程序產(chǎn)生的。權(quán)限的彈出正是由于程序產(chǎn)生的。所以在這個(gè)方法中取消動(dòng)畫就可以

三.壓縮

場(chǎng)景:開始的時(shí)候沒有壓縮,而且自測(cè)的時(shí)候把自己寫的東西當(dāng)?shù)粯拥墓┲?,生怕點(diǎn)壞了,測(cè)試就不一樣了,把你寫的東西當(dāng)成喜當(dāng)?shù)脕?lái)的孩子,往死了折騰。大部分手機(jī)像素都非常高,拍夠30秒,視頻上傳失敗。

定位:視頻文件過(guò)大

解決:在視頻錄制輸出的時(shí)候就要壓縮,設(shè)置視頻輸出的屬性,以此來(lái)達(dá)到視頻壓縮的效果,這樣會(huì)整體的提高視頻錄制的效率,

// 這里是重點(diǎn),分辨率和比特率

// 分辨率越大視頻大小越大,比特率越大視頻越清晰

// 清晰度由比特率決定,視頻尺寸和像素量由分辨率決定

// 比特率越高越清晰(前提是分辨率保持不變),分辨率越大視頻尺寸越大。

在這里要根據(jù)不同的手機(jī)來(lái)做不同的壓縮,不過(guò)小米手機(jī)我做了特別處理。因?yàn)榻?jīng)過(guò)大量的測(cè)試,只有小米的手機(jī)在同樣的參數(shù)下,壓縮出來(lái)的視頻過(guò)大。

一般手機(jī) int y =3*1024*1024;

小米手機(jī) int y =2*動(dòng)態(tài)的寬*動(dòng)態(tài)的高;

嘻嘻到這里就是我遇到的比較奇葩的難點(diǎn) ,其他的難點(diǎn)網(wǎng)上解決辦法一大把。嘻嘻只是給大家提供一下思路 拒絕伸手黨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,769評(píng)論 25 709
  • 想到視頻錄制,肯定又是運(yùn)用MediaRecorder,這個(gè)類實(shí)在是方便,但是好用的東西一定要慎重,畢竟沒有那么便宜...
    2c2z0閱讀 2,169評(píng)論 0 2
  • 紹興被譽(yù)為東方威尼斯,之前聽人說(shuō)過(guò)紹興的很多路名之前都是橋的,后來(lái)因?yàn)楦慕ū阈蕹闪寺?。之前搭車時(shí)遇到的紹興...
    桃子的小站閱讀 429評(píng)論 1 2
  • 你可知, 我曾深埋淤泥之下, 滿身污垢。 為你, 我破土而出, 除盡鉛華。 你可知, 我曾隱于俗世之間, 逍遙紅塵...
    池亦珩閱讀 390評(píng)論 8 11
  • 韓晴是個(gè)小餐廳的職員, 一天早上, 她在一堆樹枝下發(fā)現(xiàn)了小狗皮皮, 蜷縮著的身子, 大大的泛著淚光的眼睛, 好像在...
    94暖暖陽(yáng)光閱讀 376評(píng)論 0 2

友情鏈接更多精彩內(nèi)容