MediaRecorder 录制视频适配问题


阿西吧,硬解 适配起来爆炸,软解又不会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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值