Android音视频之MediaRecorder音视频录制 下载本文

内容发布更新时间 : 2024/12/27 7:16:28星期一 下面是文章的全部内容请认真阅读。

Android音视频之MediaRecorder音视频录制 效果图:

MediaRecorder类介绍:

MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息。

MediaRecorder主要函数:

setAudioChannels(int numChannels) 设置录制的音频通道数 setAudioEncoder(int audio_encoder) 设置audio的编码格式 setAudioEncodingBitRate(int bitRate) 设置录制的音频编码比特率 setAudioSamplingRate(int samplingRate) 设置录制的音频采样率 setAudioSource(int audio_source) 设置用于录制的音源

setAuxiliaryOutputFile(String path) 辅助时间的推移视频文件的路径传递

setAuxiliaryOutputFile(FileDescriptor fd)在文件描述符传递的辅助时间的推移视频 setCamera(Camera c) 设置一个recording的摄像头 setCaptureRate(double fps) 设置视频帧的捕获率

setMaxDuration(int max_duration_ms) 设置记录会话的最大持续时间(毫秒) setMaxFileSize(long max_filesize_bytes) 设置记录会话的最大大小(以字节为单位) setOutputFile(FileDescriptor fd) 传递要写入的文件的文件描述符 setOutputFile(String path) 设置输出文件的路径

setOutputFormat(int output_format) 设置在录制过程中产生的输出文件的格式 setPreviewDisplay(Surface sv) 表面设置显示记录媒体(视频)的预览 setVideoEncoder(int video_encoder) 设置视频编码器,用于录制 setVideoEncodingBitRate(int bitRate) 设置录制的视频编码比特率 setVideoFrameRate(int rate) 设置要捕获的视频帧速率

setVideoSize(int width, int height) 设置要捕获的视频的宽度和高度

setVideoSource(int video_source) 开始捕捉和编码数据到setOutputFile(指定的文件) setLocation(float latitude, float longitude) 设置并存储在输出文件中的地理数据(经度和纬度)

setProfile(CamcorderProfile profile) 指定CamcorderProfile对象 setOrientationHint(int degrees)设置输出的视频播放的方向提示

setOnErrorListener(MediaRecorder.OnErrorListener l)注册一个用于记录录制时出现的错误的监听器

setOnInfoListener(MediaRecorder.OnInfoListener listener)注册一个用于记录录制时出现的信息事件

getMaxAmplitude() 获取在前一次调用此方法之后录音中出现的最大振幅 prepare()准备录制。 release()释放资源

reset()将MediaRecorder设为空闲状态 start()开始录制 stop()停止录制

MediaRecorder主要配置参数:

1.)视频编码格式MediaRecorder.VideoEncoder

default,H263,H264,MPEG_4_SP,VP8

2.)音频编码格式MediaRecorder.AudioEncoder

default,AAC,HE_AAC,AAC_ELD,AMR_NB,AMR_WB,VORBIS

3.)视频资源获取方式MediaRecorder.VideoSource

default,CAMERA,SURFACE

4.)音频资源获取方式MediaRecorder.AudioSource

defalut,camcorder,mic,voice_call,

voice_communication,voice_downlink,voice_recognition, voice_uplink

5.)资源输出格式MediaRecorder.OutputFormat

amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp,aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm

MediaRecorder录制视频简单实现:

1.)需要添加权限

android:name=\ />

2.)简单实现录制视频

public class MediaRecorderActivity extends Activity implements SurfaceHolder.Callback {

private SurfaceView mSurfaceView;

private SurfaceHolder mSurfaceHolder; private Button btnStartStop;

private boolean isRecording = false;//标记是否已经在录制 private MediaRecorder mRecorder;//音视频录制类 private Camera mCamera = null;//相机

private Camera.Size mSize = null;//相机的尺寸 private int mCameraFacing =

Camera.CameraInfo.CAMERA_FACING_BACK;//默认后置摄像头

private static final SparseIntArray orientations = new SparseIntArray();//手机旋转对应的调整角度

static {

orientations.append(Surface.ROTATION_0, 90);

orientations.append(Surface.ROTATION_90, 0); orientations.append(Surface.ROTATION_180, 270); orientations.append(Surface.ROTATION_270, 180); }

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setWindow();

setContentView(R.layout.activity_media_recorder); initViews(); }

private void setWindow() {

requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏

// 设置竖屏显示

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 选择支持半透明模式,在有surfaceview的activity中使用。 getWindow().setFormat(PixelFormat.TRANSLUCENT); }

private void initViews() {

mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); btnStartStop = (Button) findViewById(R.id.btnStartStop); btnStartStop.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) { if (!isRecording) { startRecord(); } else {

stopRecord(); } } });

SurfaceHolder holder = mSurfaceView.getHolder();// 取得holder

holder.setFormat(PixelFormat.TRANSPARENT); holder.setKeepScreenOn(true);

holder.addCallback(this); // holder加入回调接口 }

/**

* 初始化相机 */

private void initCamera() {

if (Camera.getNumberOfCameras() == 2) { mCamera = Camera.open(mCameraFacing); } else {

mCamera = Camera.open(); }

CameraSizeComparator sizeComparator = new CameraSizeComparator();

Camera.Parameters parameters = mCamera.getParameters();

if (mSize == null) {

List vSizeList = parameters.getSupportedPreviewSizes();

Collections.sort(vSizeList, sizeComparator);

for (int num = 0; num < vSizeList.size(); num++) { Camera.Size size = vSizeList.get(num);

if (size.width >= 800 && size.height >= 480) { this.mSize = size; break; } }

mSize = vSizeList.get(0);

List focusModesList = parameters.getSupportedFocusModes();

//增加对聚焦模式的判断 if

(focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

} else if

(focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {