作為一個專業(yè)的程序員,怎么能少得了技術(shù)的文章呢暂刘,詩云:“胸藏文墨懷若谷饺谬,腹有詩書氣自華”,妥妥的就是一個翻版的我谣拣。明明可以靠顏值募寨,非要靠才華。
前言:
近來閑來無事森缠,總結(jié)了一下之前做過的經(jīng)典的小案例拔鹰,最精彩的莫過于模仿微信的小視頻。公司的需求就是要拍一個繞車的小視頻贵涵,具體的要求就是不超過三十秒 列肢,視頻文件大小限制在20M,必不可少是各個型號的適配宾茂。
嘻嘻在這里具體的demo就不往外貼了瓷马,下面主要說一下我在這個項(xiàng)目中遇到的難點(diǎn),其實(shí)主要分為三大塊 1 是黑屏? 2是權(quán)限 3是壓縮
一.黑屏
場景:運(yùn)行的時候發(fā)現(xiàn)跨晴,只有第一次進(jìn)入時錄制界面能成功預(yù)覽欧聘,一旦用back按鍵返回或者按home鍵回到主界面,再啟動程序的時候坟奥,預(yù)覽界面就變黑了树瞭。
定位:黑屏說明surfaceview沒有重新繪制。
解決:在界面重新獲取焦點(diǎn)的時候要重新繪制爱谁,在OnResume()方法中開啟一下相機(jī),我是把OnCreate()中的代碼挪了過來孝偎。在焦點(diǎn)的消失的別忘了在onPause()中關(guān)閉相機(jī)访敌。如果你認(rèn)為這樣簡簡單單的就完成那就錯了。經(jīng)過一番測試衣盾,在華為 榮耀 三星S6中還是不行寺旺,經(jīng)過一番的查找資料 ,開啟相機(jī)的時候做一下延遲势决,調(diào)用底層so檔的需要時間阻塑。我是延遲了50ms;所以最終解決辦法還需要將上述OnResume()中的開啟相機(jī)方法改成如下:
?try {
????Thread.sleep(50);
?} catch (InterruptedException e) {
?????// TODO Auto-generated catch block
?????e.printStackTrace();
?} ??
二.權(quán)限
場景:在系統(tǒng)版本5.0以下的手機(jī)果复,手機(jī)的權(quán)限是自己去申請的陈莽,權(quán)限拒絕的時候,錄制的動畫還在走,并且在魅族手機(jī)上出現(xiàn)了崩潰走搁。
定位: 得到權(quán)限的狀態(tài)独柑,沒有權(quán)限的時候禁止操作。
解決:沒有使用第三方的狀態(tài)庫私植,因?yàn)轫?xiàng)目偏老忌栅。而是用了一個比較笨而且實(shí)用的方法;針對權(quán)限:
/**
*? 返回true 表示可以使用? 返回false表示不可以使用
*/
public static boolean cameraIsCanUse() {
????boolean isCanUse =true;
? ? Camera mCamera =null;
? ? try {
????????mCamera = Camera.open();
? ? ? ? Camera.Parameters mParameters = mCamera.getParameters(); //針對魅族手機(jī)
? ? ? ? ?mCamera.setParameters(mParameters);
? ? }catch (Exception e) {
????????isCanUse =false;
? ? }
????if (mCamera !=null) {
????????try {
????????????mCamera.release();
? ? ? ? }catch (Exception e) {
????????????e.printStackTrace();
? ? ? ? ? ? return isCanUse;
? ? ? ? }
????}
return isCanUse;
}
針對動畫的解決方案是根據(jù)權(quán)限來判斷,后來想想了太笨了曲稼,根據(jù)onTouch事件來做的操作索绪,當(dāng)權(quán)限彈出來的時候,觸摸的位置已經(jīng)改變贫悄,但是手指沒有抬起者春。onTouch中有四個狀態(tài),分別是1清女、ACTION_DOWN:表示按下了屏幕钱烟,第一個執(zhí)行也是必然執(zhí)行的方法。2嫡丙、ACTION_MOVE:表示為移動手勢拴袭,會不斷的執(zhí)行直到觸摸停止。3曙博、ACTION_UP?:表示為離開屏幕拥刻,觸摸停止的時候執(zhí)行。4父泳、ACTION_CANCEL:表示取消手勢般哼,不會由用戶產(chǎn)生,而是由程序產(chǎn)生的惠窄。權(quán)限的彈出正是由于程序產(chǎn)生的蒸眠。所以在這個方法中取消動畫就可以
三.壓縮
場景:開始的時候沒有壓縮,而且自測的時候把自己寫的東西當(dāng)?shù)粯拥墓┲巳冢曼c(diǎn)壞了楞卡,測試就不一樣了,把你寫的東西當(dāng)成喜當(dāng)?shù)脕淼暮⒆悠⑿懒苏垓v蒋腮。大部分手機(jī)像素都非常高,拍夠30秒藕各,視頻上傳失敗池摧。
定位:視頻文件過大
解決:在視頻錄制輸出的時候就要壓縮,設(shè)置視頻輸出的屬性激况,以此來達(dá)到視頻壓縮的效果作彤,這樣會整體的提高視頻錄制的效率膘魄,
// 這里是重點(diǎn),分辨率和比特率
// 分辨率越大視頻大小越大宦棺,比特率越大視頻越清晰
// 清晰度由比特率決定瓣距,視頻尺寸和像素量由分辨率決定
// 比特率越高越清晰(前提是分辨率保持不變),分辨率越大視頻尺寸越大代咸。
在這里要根據(jù)不同的手機(jī)來做不同的壓縮蹈丸,不過小米手機(jī)我做了特別處理。因?yàn)榻?jīng)過大量的測試呐芥,只有小米的手機(jī)在同樣的參數(shù)下逻杖,壓縮出來的視頻過大。
一般手機(jī) int y =3*1024*1024;
小米手機(jī) int y =2*動態(tài)的寬*動態(tài)的高;
嘻嘻到這里就是我遇到的比較奇葩的難點(diǎn) 思瘟,其他的難點(diǎn)網(wǎng)上解決辦法一大把荸百。嘻嘻只是給大家提供一下思路 拒絕伸手黨。