在Android手機上實現類似於iphone中的LivePhoto的功能
源代碼分享
github:https://github.com/amazingyyc/DeepRed
代碼說明:
1.改變視頻的分辨率:修改com.deepcolor.deepred.shot.CameraInstance中的MIN_PREVIEW_WIDTH的值,MIN_PREVIEW_WIDTH越大視頻分辨率越大。
2.改變視頻bit率:修改jni/encoder.cpp下的int Encoder::get_bit_rate_by_height(int height)函數
3.改變視頻幀率:修改jni/content.h中的VIDEO_FPS值
3.改變音頻bit率:修改jni/content.h下的AUDIO_BIT_RATE值
4.改變視頻長度:修改jni/content.h下的TIME_DURATION和com.deepcolor.deepred.shot.ShotInstance中的ADD_SECOND_PART_MSG_DELAY_TIME的值
5.改變視頻存儲位置:修改com.deepcolor.deepred.util.FileUtil下的getAppPath()函數
Demo
當點擊”拍攝按鈕“同時按下鼠標點擊秒表”啟動“,可以看到同時記錄的大約前后1.5s的視頻
界面:
1:中間“黃色攝像機”圖標:是否開啟livephoto功能
2:“閃電圖標”:對焦模式
3:左右滑動切換前后攝像頭
原理:
1:在jni層保持2個隊列,分別存儲1.5s的視頻和音頻數據。視頻數據直接調用系統自帶的回調函數onPreviewFrame(byte[] data, Camera camera) 的到每一幀的視頻數據。
音頻新建一個線程循環的從AudioRecord讀取音頻數據。當數據超過1.5s時就彈出隊前數據,然后在加入。
2:當點擊拍攝按鈕的時候
a:新建一個線程,將當前隊列中的視頻&音頻數據拷貝到線程中,並同時開始使用FFmpeg將數據編碼成mp4視頻文件
b:同時發送一個1.5s的“延遲消息”,當主線程收到“延遲消息”時,再將當前的隊列中的數據拷貝到對應的線程中。
3:直到所有的數據都編碼到文件中,結束
問題:
1:慢!慢!慢!,非常的慢。編碼3s的1080*760的視頻總共45幀,需要16s左右!! 640*480也大約需要5s,沒有辦法做到實時的拍攝。
原因是使用FFmpeg純軟件編碼速度自然很慢,解決辦法可以使用Android自帶的硬件編碼接口MediaCodec代替FFmpeg進行視頻編碼,手機對MediaCodec支持有問題沒辦法測試。
2:源代碼按鍵的同時拍攝一段“小視頻”,沒進行圖片的拍攝,調用系統接口即可實現,太懶了不想做了。。。。修改的地方在:com.deepcolor.deepred.sho.ShotInstance中的
takePicture()函數。
3:視頻播放的高斯模糊沒實現,要實現高斯模糊可以參考前后攝像頭的切換效果,代碼在com.deepcolor.deepred.view.CameraView中。