Android 基於MediaCodec+MediaMuxer實現音視頻錄製合成

AudioVideoCodec

一款視頻錄像機,支持AudioRecord錄音、MediaCodec輸出AAC、MediaMuxer合成音頻視頻並輸出mp4,支持自動對焦、屏幕亮度調節、錄製視頻時長監聽、手勢縮放調整焦距等git

項目地址

  1. 音視頻錄製合成(github.com/MannaYang/A…)
  2. 單獨音頻錄製播放(github.com/MannaYang/A…)

功能簡介

目前包含基本的音頻、視頻錄製與合成操做,功能以下:github

  1. 基於AudioRecord錄製原始PCM格式音頻數據
  2. 基於MediaCodec編碼輸出音頻爲AAC格式
  3. 基於MediaCdec.createInputSurface()建立Surface,EGLContext綁定Surface並經過渲染FBO已綁定的紋理錄製視頻
  4. 基於FBO離屏紋理繪製水印紋理並添加至錄製視頻文件
  5. 基於MediaMuxer合成音頻、視頻數據並輸出MP4視頻文件
  6. 提供基於shader語言修改片元着色器color完成黑白濾鏡
  7. 提供相機預覽時自動調節預覽焦距、屏幕亮度
  8. 提供相機預覽時切換閃光燈、先後置攝像頭
  9. 提供相機預覽時雙指縮放調節預覽畫面、SeekBar拖動調節

未實現:ide

  1. 手動點擊屏幕聚焦縮放預覽畫面測試

  2. 橫屏預覽、錄製時上下滑動屏幕左半部分調節屏幕亮度、右半部分調節音頻音量編碼

  3. 預覽濾鏡貼紙、美顏等其它濾鏡功能code

  4. 音頻錄製時回聲消除、靜音降噪cdn

    未實現緣由 : 該部份內容須要對OpenGL ES繪製原理、音頻數據存儲、手勢滑動處理、Camera相機聚焦等須要有深刻理解視頻

採坑之旅

  1. 先後攝像頭切換 目前測試的華爲P8max上由後置切換爲前置時,始終報setParameters failed,通過逐行代碼驗證,是因爲設置parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO) 自動對焦致使,部分華爲、三星手機前置攝像頭不容許聚焦(目前自有測試機如此,若是有華爲、三星手機測試可行歡迎提供型號)blog

  2. 自動對焦失效問題 目前項目中自動對焦採用的是 : parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);遇到的問題就是移動屏幕時對焦會屏幕閃爍, 包括Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO;因手動點擊聚焦未實現,此處未深刻研究適配全部機型,歡迎測試其它機型並給出有效方案!圖片

  3. 設置Camera預覽大小、圖片大小致使setParameters failed 目前項目CameraManager管理類中,經過獲取手機設備支持的預覽大小、圖片大小,取最適合當前預覽的尺寸,解決上述問題;通常報setParameters failed須要檢查 對Camera.Parameters設置的參數仔細檢查

  4. MediaCodec.queueInputBuffer參數中的時間戳問題 以前對該處時間戳計算公式理解有誤,致使錄製的視頻始終沒法播放,一幀音頻幀大小 int size = 採樣率 x 位寬 x 採樣時間 x 通道數,此處時間戳單位時微秒, pcm錄製的原始單位是bit,雙聲道16bit,採用byte[]、short[]裝載數據須要進行換算,1 byte = 8 bit,項目中有詳細註釋,歡迎查證!

公共庫

目前該項目直接是以單個Activity承載預覽、錄製、閃光燈、切換鏡頭、黑白濾鏡、手勢縮放、SeekBar顯示縮放進度等功能,library提供的是aop權限申請庫

截圖展現

初始預覽 :

閃光燈 :

濾鏡:

錄製中 :

後置切換前置 :

播放水印視頻 :

感謝開源

github.com/ChinaZeng/S…

個人我的星球

歡迎加入星球一塊兒討論項目、研究新技術,共同成長!

相關文章
相關標籤/搜索