Android MediaRecorder錄製模糊的解決辦法
阿新 • • 發佈:2018-12-16
依照網上的demo,自寫的應用錄製15秒的視訊只有200K左右的大小,開啟一看就很模糊。影響了視訊的後續處理(我們需要對視訊後期提取顏色或動作變化的波形)。需要提高視訊的錄製質量。
解決辦法: 網上流傳比較廣的一種辦法是
法一:設定CamcorderProfile
//程式碼源自網路
/***********原來的寫法************/
mMediaRecorder=new MediaRecorder();
//設定視訊源
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource. DEFAULT);
//設定音訊源
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
//設定檔案輸出格式
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
//設定視訊編碼方式
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
/*
* 設定視訊編碼幀率
mMediaRecorder.setVideoEncodingBitRate(5*1920*1080);
*/
//設定音訊編碼方式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//設定視訊高和寬,注意文件的說明:
Must be called after setVideoSource().
//設定錄製的視訊幀率,注意文件的說明:
mMediaRecorder.setVideoFrameRate(30);
//設定輸出路徑
mMediaRecorder. setOutputFile("/sdcard/Document/data/"+ currentTemp + "/"
+ currentXml + "/"+System.currentTimeMillis()+".mp4");
//設定預覽畫面
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
mSurfaceHolder.setFixedSize(640,480);//最高只能設定640x480
mMediaRecorder.setVideoSize(640,480);//最高只能設定640x480
//設定視訊的最大持續時間
mMediaRecorder.setMaxDuration(30000);
/***********調整後的寫法************/
//next codes is right for 2.3 and 4.0
mMediaRecorder=new MediaRecorder();
//設定視訊源
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
//設定音訊源
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
//相機引數配置類
//直接採用QUALITY_HIGH,這樣可以提高視訊的錄製質量,但是不能設定編碼格式和幀率等引數。
CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mMediaRecorder.setProfile(cProfile);
//設定錄製的視訊幀率,注意文件的說明:
mMediaRecorder.setVideoFrameRate(30);
//設定輸出路徑
mMediaRecorder.setOutputFile("/sdcard/Document/data/"+ currentTemp + "/"
+ currentXml + "/"+System.currentTimeMillis()+".mp4");
//設定預覽畫面
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
/************************/
法二:位元率
看一下是否設定了視訊的位元率編碼,可以適當調高位元率的值,有奇效。
(在師兄的機智的幫助下,找到了這個法子,我實在是離不開師兄了)
程式碼在上面的註釋中,沒有的話試試加一行這個程式碼看看,或者是將5改成8改成10。
我一開始沒有設定位元率,加上後已經滿足計算需求,改成8效果更好了一些,並未嘗試10。
注:
如果是像我一樣一開始只有小几百K的話,那大概就是沒有設定位元率,這時候系統呼叫了最低的配置來降低消耗,加上那一行程式碼,有奇效。