作為一個(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)上解決辦法一大把。嘻嘻只是給大家提供一下思路 拒絕伸手黨。