阿西吧,硬解 适配起来爆炸,软解又不会ffmpeg.Vitamio好用但是用不起,三天就要这个视频功能,自己写个MediaRecorder 先凑合用,
视频的时候各种原因,编码方式,帧数,码率,分辨率,都是适配的点,废话不多说先上代码
@SuppressLint("NewApi")
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(MediaRecorder.VideoSource.CAMERA);// 视频源
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 音频源
mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 视频输出格式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 音频格式
// mMediaRecorder.setVideoSize(mWidth, mHeight);// 设置分辨率:
// mMediaRecorder.setVideoFrameRate(16);// 这个我把它去掉了,感觉没什么用
// mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 1024 * 100);// 设置帧频率,然后就清晰了
// mMediaRecorder.setOrientationHint(90);// 输出旋转90度,保持竖屏录制
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);// 视频录制格式
// mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000);
mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());*/
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置声源
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置视频源
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//设置音频输出格式为3gp DEFAULT THREE_GPP
mMediaRecorder.setVideoFrameRate(100);//每秒3帧
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);//录制视频编码 264
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//设置音频编码为amr_nb AMR_NB DEFAULT AAC
mMediaRecorder.setVideoSize(640, 480);//设置录制视频尺寸 mWidth mHeight
mMediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024 );
mMediaRecorder.setOrientationHint(90);// 输出旋转90度,保持竖屏录制
mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());//设置视频输出文件路径
Log.e("wocaowocaowocao", mVecordFile.getAbsolutePath());
//TODO
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
mMediaRecorder.prepare();
try {
Log.e("wocaoMMMMMM", "start"+stopkey);
mMediaRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (RuntimeException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
上面注掉的,是之前用的代码,本着最大适配的原则.华为荣耀,真是重灾区,改为之后的代码,看下效果吧,也不知道会咋样.
改为default的原因是...觉得会增加适配的概率,是的你没看错,就是觉得. 233333333333333333333,原因是自己做过一年底层手机系统开发
在android系统Framework层,有Mediarecorder.h文件,其中有定义:
enum video_source {VIDEO_SOURCE_DEFAULT = 0,
VIDEO_SOURCE_CAMERA = 1,
VIDEO_SOURCE_GRALLOC_BUFFER = 2,
VIDEO_SOURCE_LIST_END // must be last - used to validate audio source type
};
//Please update media/java/android/media/MediaRecorder.java if the following is updated.
enum output_format {
OUTPUT_FORMAT_DEFAULT = 0,
OUTPUT_FORMAT_THREE_GPP = 1,
OUTPUT_FORMAT_MPEG_4 = 2,
OUTPUT_FORMAT_AUDIO_ONLY_START = 3, // Used in validating the output format. Should be the
// at the start of the audio only output formats.
/* These are audio only file formats */
OUTPUT_FORMAT_RAW_AMR = 3, //to be backward compatible
OUTPUT_FORMAT_AMR_NB = 3,
OUTPUT_FORMAT_AMR_WB = 4,
OUTPUT_FORMAT_AAC_ADIF = 5,
OUTPUT_FORMAT_AAC_ADTS = 6,
/* Stream over a socket, limited to a single stream */
OUTPUT_FORMAT_RTP_AVP = 7,
/* H.264/AAC data encapsulated in MPEG2/TS */
OUTPUT_FORMAT_MPEG2TS = 8,
OUTPUT_FORMAT_LIST_END // must be last - used to validate format type
};
enum audio_encoder {
AUDIO_ENCODER_DEFAULT = 0,
AUDIO_ENCODER_AMR_NB = 1,
AUDIO_ENCODER_AMR_WB = 2,
AUDIO_ENCODER_AAC = 3,
AUDIO_ENCODER_AAC_PLUS = 4,
AUDIO_ENCODER_EAAC_PLUS = 5,
AUDIO_ENCODER_LIST_END // must be the last - used to validate the audio encoder type
};
enum video_encoder {
VIDEO_ENCODER_DEFAULT = 0,
VIDEO_ENCODER_H263 = 1,
VIDEO_ENCODER_H264 = 2,
VIDEO_ENCODER_MPEG_4_SP = 3,
VIDEO_ENCODER_LIST_END // must be the last - used to validate the video encoder type
};
所以觉得..default 会增加适配率,就是这么单蠢...2333
另:H263,AAC,3gp是最宽适配一般厂商都支持. 但是规定死了,总觉得没default好.就酱.
ffmpeg 软解仿微信录制小视频 ,集成简单,功能强大,地址:
http://mp.weixin.qq.com/s/2rhY0q9qskz51tBmleiSKw