一、问题代码
private void initRecord() throws IOException {
mMediaRecorder = new MediaRecorder()
mMediaRecorder.reset()
if (mCamera != null)
mMediaRecorder.setCamera(mCamera)
mMediaRecorder.setOnErrorListener(this)
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface())
mMediaRecorder.setVideoSource(VideoSource.CAMERA)
mMediaRecorder.setAudioSource(AudioSource.MIC)
mMediaRecorder.setVideoSize(mWidth, mHeight)
mMediaRecorder.setVideoFrameRate(16)
mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 1024 * 100)
mMediaRecorder.setOrientationHint(90)
mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4)
mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB)
mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP)
// mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000)
mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath())
mMediaRecorder.prepare()
try {
mMediaRecorder.start()
} catch (IllegalStateException e) {
e.printStackTrace()
} catch (RuntimeException e) {
e.printStackTrace()
} catch (Exception e) {
e.printStackTrace()
二、问题解析及解决方案
1、start failed: -19
原因:设置的宽高数值必须要和摄像头支持的数值相匹配,否则报错
解决方法:
①把setVideoSize和setVideoFrameRate放到设置编码和格式的代码后面(亲测可行)
②不行就把setVideoSize和setVideoFrameRate注释掉
2、start failed: -38
原因:开始录像的时候,已经了开启录音,抢用麦克风了。
解决方法:把setAudioSource(AudioSource.MIC);换成setAudioSource(AudioSource.DEFAULT)
原因:setVideoSize是设置视频分辨率,跟设备硬件有关,若手机不支持则会报该错误。
解决方法:
①把setVideoSize和setVideoFrameRate放到设置编码和格式的代码后面(亲测可行)
②不行就把setVideoSize和setVideoFrameRate注释掉
解决方法:
①如果代码中设置了setProfile,就把setProfile设置去掉
// CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);//可以提高视频质量
// mMediaRecorder.setProfile(cProfile);
②更换视频格式(mp4报错就换3gp)
三、正常代码
贴一份可以在Android6.0上跑的代码(被注释的代码可以无视):
private void initRecord() throws IOException {
mMediaRecorder = new MediaRecorder()
try {
mMediaRecorder.reset()
if (mCamera != null)
mMediaRecorder.setCamera(mCamera)
mMediaRecorder.setOnErrorListener(this)
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface())
mMediaRecorder.setVideoSource(VideoSource.CAMERA)
mMediaRecorder.setAudioSource(AudioSource.DEFAULT)
mMediaRecorder.setVideoEncodingBitRate(5*1024*1024)
mMediaRecorder.setOrientationHint(90)
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP)
// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mMediaRecorder.setVideoSize(320, 240)
// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mMediaRecorder.setVideoFrameRate(20)
// mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000)
mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath())
mMediaRecorder.prepare()
} catch (Exception e) {
e.printStackTrace()
releaseRecord()
try {
mMediaRecorder.start()
} catch (IllegalStateException e) {
e.printStackTrace()
} catch (RuntimeException e) {
e.printStackTrace()
} catch (Exception e) {
e.printStackTrace()
四、常见设置
1、编码格式设置
1) mp4
mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4)
mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB)
mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP)
2) 3gp
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT)
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263)
2、视频清晰度设置:
// 所说越大清晰度最高(但是我自己测试5*1024*1024是最清晰的)
mMediaRecorder.setVideoEncodingBitRate(5*1024*1024);
// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mMediaRecorder.setVideoSize(240,320);
// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mMediaRecorder.setVideoFrameRate(20);
五、开源控件
https://github.com/GitLqr/LQRViedoRecordView
一、问题代码private void initRecord() throws IOException { mMediaRecorder = new MediaRecorder(); mMediaRecorder.reset(); if (mCamera != null) mMediaRecorder.setCamera(mCam
最近项目录制适配时,组内其他人员开发的录制视频很模糊,由我负责解决。
本以为十分简单,万万没想到费了半天功夫。因为资料比较难找,我发现模糊是由于分辨率比较低,以为直接
mMediaRecorder.setVideoSize(640,480);
就ok了,结果不然,发现设置本机的分辨率时,没有问题,但是如果设置的比较小,就会有tart failed异常。
找了很多原因,才发现setV
mMediaRecorder.setVideoSize(videoWidth, videoHeight);
//每秒的帧数
mMediaRecorder.setVideoFrameRate(24);
//编码格式
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
都啥问题注意
1、视频的预览角度
有可能你的预览角度和播放角度都有问题,跟机型有关,也是因为机型的不同可能你们的选择角度还不一样呢,那怎么处理呢?好办法当然是去找算法,去自适应的调整。这里就简单告诉你咋用就完事了,
想要调整捕获的预览角度就要申请Camera对象进行参数调整,
MediaRecorder 录像配置主要涉及输出文件路径、音频来源、视频来源、输出格式、音频编码格式、视频编码格式、比特率、帧率和视频尺寸等。
我们假设视频输入源来自 Camera,Camera2 API 将相机图像渲染到
MediaRecorder 提供的 Surface 上,而
MediaRecorder 将这个渲染数据编码为 H264。
* 配置录制视频相关数据
private void config
MediaRecorder(){
1. 报错这种情况一般是由于 初始化顺序不对
或者是设置了分辨率手机不兼容 需要设置为
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.vid
一. at android.media.MediaRecorder.start(Native Method)解决方法
1. 注释掉
//mRecorder.setVideoFrameRate(15);
2. 设置屏幕分辨率
1)获取屏幕分辨率:
DisplayMetrics displaysMetrics = new DisplayMetrics();
getWin
在调用MediaRecorder.setVideoSize方法设置宽高时,由于宽高是动态获取的屏幕宽高,但是这个方法不允许传入奇数值,而出问题的手机的高度刚好就是奇数,所以就报错了。
解决办法就是判断下宽高是否奇数,是的话就减1让它变成偶数,再调用setVideoSize方法
由于该方法是Native方法,暂时不知道为什么一定只能传奇数,有知道的朋友可以下面留言告诉我
以下是一个简单的HTML页面,它包含一个按钮,点击按钮可以调用电脑的麦克风录音,松开按钮停止录音,并将录音文件POST到一个URL地址:<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("#button").click(function(){
// 开始录音
navigator.mediaDevices.getUserMedia({ audio: true }).then(function(stream) {
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start();
// 松开按钮停止录音
$("#button").mouseup(function(){
mediaRecorder.stop();
// 将录音文件POST到一个URL地址
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://example.com/upload', true);
xhr.send(mediaRecorder.blob);
</script>
</head>
<button id="button">开始录音</button>
</body>
</html>