当前位置: 代码迷 >> Android >> android->>>mediarecord的使用,根据网下的例子修改
  详细解决方案

android->>>mediarecord的使用,根据网下的例子修改

热度:68   发布时间:2016-05-01 15:03:43.0
android-->>>mediarecord的使用,根据网上的例子修改

     最近研究一下怎么使用android录像功能,在网上找的例子无尽的报错,脑袋都大了,还好现在一个一个解决了...........。

遇到了N多个问题,开始时start failed,后来又stop failed,整理在这供自己以后学习参考,如果大家有更好的方法-->>回帖告诉俄这个菜鸟哦....

     先给个图吧,测试时在模拟器上测试的.......,如果哪位能在真机上测试报错的话,反馈一下错误信息,相互学习一下了


主页代码如下:

package com.zte.camera_test;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.hardware.Camera;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.annotation.SuppressLint;import android.app.Activity;public class MainActivity extends Activity {	Button button;	boolean isRecording = false;	MediaRecorder mMediaRecorder;	private SurfaceView mPreview;	public static final int MEDIA_TYPE_IMAGE = 1;	public static final int MEDIA_TYPE_VIDEO = 2;	@Override	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.main);		button = (Button) findViewById(R.id.layout_button);		mPreview = (SurfaceView) findViewById(R.id.layout_surfeve);		buttonClickListener();	}	public void buttonClickListener() {		button.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				// TODO Auto-generated method stub				if (isRecording) {					releaseMediaRecorder();// 释放MediaRecorder对象					isRecording = false;				} else {					// 初始化视频camera					if (prepareVideoRecorder()) {						// Camera已可用并解锁,MediaRecorder已就绪,						// 现在可以开始录像						mMediaRecorder.start();						isRecording = true;					} else {						// 准备未能完成,释放camera						releaseMediaRecorder();					}				}			}		});	}	private boolean prepareVideoRecorder() {		mMediaRecorder = new MediaRecorder();		// 指定源录音及录像--->>>开始自己用的是camera录制视频,报错,stop fail		mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);		mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);				// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4 		mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);		mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);		// 设置录制的视频编码h263 h264 		mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);				//没有设置大小报错,start faild(240-320,320-480,600-480,480-800,800-600)过好内是我试过的大小,只有240-320情况下报错		mMediaRecorder.setVideoSize(800, 600);		 // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错 		mMediaRecorder.setVideoFrameRate(20); 		// 指定输出文件		mMediaRecorder.setOutputFile(getOutputMediaFile()				.toString());		// 指定预览输出		mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());		// 根据以上配置准备MediaRecorder		try {			mMediaRecorder.prepare();		} catch (IllegalStateException e) {			releaseMediaRecorder();			return false;		} catch (IOException e) {			releaseMediaRecorder();			return false;		}		return true;	}	private void releaseMediaRecorder() {		if (mMediaRecorder != null) {							mMediaRecorder.stop();				mMediaRecorder.reset();				mMediaRecorder.release();// 释放recorder对象				mMediaRecorder = null;			}	}	private static File getOutputMediaFile() {		File mediaStorageDir = new File(				Environment						.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),				"MyCameraApp");		if (!mediaStorageDir.exists()) {			if (!mediaStorageDir.mkdirs()) {				return null;			}		}		String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")				.format(new Date());		File mediaFile;		mediaFile = new File(mediaStorageDir.getPath() + File.separator				+ "VID_" + timeStamp + ".mp4");				return mediaFile;	}	protected void onPause() {		super.onPause();		releaseMediaRecorder();	}	@Override	protected void onDestroy() {		releaseMediaRecorder();		super.onDestroy();	}}

xml布局如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <SurfaceView        android:id="@+id/layout_surfeve"        android:layout_width="480dip"        android:layout_height="400dip" >    </SurfaceView>    <Button        android:id="@+id/layout_button"        android:layout_width="100dp"        android:layout_height="wrap_content"        android:layout_below="@id/layout_surfeve"        android:text="clicklistener" />    <!--         <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"        android:text="@string/hello_world"        tools:context=".MainActivity" />    --></RelativeLayout>

别忘了加权限哦......:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.zte.camera_test"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="8" />    <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name" >        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application>    <uses-permission android:name="android.permission.CAMERA" />    <uses-feature android:name="android.hardware.camera" />    <uses-feature android:name="android.hardware.camera.autofocus" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.RECORD_VIDEO" />    <uses-permission android:name="android.permission.RECORD_AUDIO" /></manifest>
下面是录制完后的播放效果,不过是在模拟器下,没什么意思,也放着看下了...



  相关解决方案