package com.yixia.camera;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.util.Log;
import com.yixia.camera.model.MediaObject.MediaPart;
import com.yixia.videoeditor.adapter.UtilityAdapter;
/**
* 视频录制:边录制边底层处理视频(旋转和裁剪)
*
* @author yixia.com
*
*/
public class MediaRecorderNative extends MediaRecorderBase implements MediaRecorder.OnErrorListener {
/** 视频后缀 */
private static final String VIDEO_SUFFIX = ".ts";
/** 开始录制 */
@Override
public MediaPart startRecord() {
//防止没有初始化的情况
if (!UtilityAdapter.isInitialized()) {
UtilityAdapter.initFilterParser();
}
MediaPart result = null;
if (mMediaObject != null) {
mRecording = true;
result = mMediaObject.buildMediaPart(mCameraId, VIDEO_SUFFIX);
String cmd = String.format("filename = \"%s\"; ", result.mediaPath);
//如果需要定制非480x480的视频,可以启用以下代码,其他vf参数参考ffmpeg的文档:
//cmd += String.format("addcmd = %s; "," -vf \"transpose=1,crop=480:480:0:0\" ");
UtilityAdapter.FilterParserAction(cmd, UtilityAdapter.PARSERACTION_START);
if (mAudioRecorder == null && result != null) {
mAudioRecorder = new AudioRecorder(this);
mAudioRecorder.start();
}
}
return result;
}
/** 停止录制 */
@Override
public void stopRecord() {
UtilityAdapter.FilterParserAction("", UtilityAdapter.PARSERACTION_STOP);
super.stopRecord();
}
/** 数据回调 */
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (mRecording) {
//底层实时处理视频,将视频旋转好,并剪切成480x480
UtilityAdapter.RenderDataYuv(data);
}
super.onPreviewFrame(data, camera);
}
/** 预览成功,设置视频输入输出参数 */
@Override
protected void onStartPreviewSuccess() {
if (mCameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
UtilityAdapter.RenderInputSettings(640, 480, 0, UtilityAdapter.FLIPTYPE_NORMAL);
} else {
UtilityAdapter.RenderInputSettings(640, 480, 180, UtilityAdapter.FLIPTYPE_HORIZONTAL);
}
UtilityAdapter.RenderOutputSettings(480, 480, mFrameRate, UtilityAdapter.OUTPUTFORMAT_YUV | UtilityAdapter.OUTPUTFORMAT_MASK_MP4 /*| UtilityAdapter.OUTPUTFORMAT_MASK_HARDWARE_ACC*/);
}
@Override
public void onError(MediaRecorder mr, int what, int extra) {
try {
if (mr != null)
mr.reset();
} catch (IllegalStateException e) {
Log.w("Yixia", "stopRecord", e);
} catch (Exception e) {
Log.w("Yixia", "stopRecord", e);
}
if (mOnErrorListener != null)
mOnErrorListener.onVideoError(what, extra);
}
/** 接收音频数据,传递到底层 */
@Override
public void receiveAudioData(byte[] sampleBuffer, int len) {
if (mRecording && len > 0) {
UtilityAdapter.RenderDataPcm(sampleBuffer);
}
}
}