多媒体 录制视频

来源:互联网 发布:如何分析竞价数据 编辑:程序博客网 时间:2024/06/05 16:42
多媒体 录制视频
MeidaRecorder除了可用录制音频之外,还可用于录制视频。使用MeidaRecorder录制视频与录制音频的步骤基本相同。只是录制视频是不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int audio_source)方法是在调用setVideoSource(int video_source)方法来设置图像来源。除此之外,还需要调用setOutputFormat设置输出文件格式之后,在进行如下步骤:
1. 调用MediaRecorder对象的setVideoEncoder(),setVideoEncodingBitRate(int bitRate) ,setVideoFrameRate 设置所录制的视频的编码格式,编码位率,每秒多少帧等,这些参数将可以控制录制视频的品质,文件大小。
2.调用MeidaRecorder的setPreviewDisplay(SurfaceView sv)方法设置使用哪个SurfaceView来显示预览 。

package com.example.recordview;

import java.io.File;
import java.io.IOException;
import android.support.v7.app.ActionBarActivity;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore.Audio.Media;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity implements OnClickListener {
// button
ImageButton record, stop;
// system audio file
File videoFile;
MediaRecorder mRecorder;
SurfaceView sView;
private boolean isRecording = false ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
record = (ImageButton) findViewById(R.id.record);
stop = (ImageButton) findViewById(R.id.stop);
stop.setEnabled(false);
record.setOnClickListener(this);
stop.setOnClickListener(this);
sView = (SurfaceView)this.findViewById(R.id.surfaceView1);
sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
sView.getHolder().setFixedSize(720, 1280);
sView.getHolder().setKeepScreenOn(true);
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
try {
if (isRecording) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
isRecording = false ;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
super.onDestroy();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void recordSound() {
try {
if (!Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
Toast.makeText(this,
"sdcard is not insert! pls insert in !", 5000)
.show();
return;
}

try {
videoFile = new File(Environment
.getExternalStorageDirectory().getCanonicalFile()
+ "/sound666.amr");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

mRecorder = new MediaRecorder();

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(videoFile.getAbsolutePath());

try {
mRecorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mRecorder.start();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.record:
if(false){
recordSound();
}else{
try {
if (!Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
Toast.makeText(this,
"sdcard is not insert! pls insert in !", 5000)
.show();
return;
}
try {
videoFile = new File(Environment
.getExternalStorageDirectory().getCanonicalFile()
+ "/myvideo.mp4");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mRecorder = new MediaRecorder();
//mRecorder.reset();
Camera camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
if (camera != null) {
camera.setDisplayOrientation(90);
camera.unlock();
mRecorder.setCamera(camera);
}

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mRecorder.setVideoSize(1280, 720);
mRecorder.setVideoFrameRate(4);
mRecorder.setOutputFile(videoFile.getAbsolutePath());
mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
mRecorder.prepare();
record.setEnabled(false);
stop.setEnabled(true);
isRecording = true;
mRecorder.start();

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

}

break;

case R.id.stop:
if(false){
try {
if (videoFile != null && videoFile.exists()) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}else
{
try {
if (isRecording) {
isRecording = false ;
mRecorder.stop();
mRecorder.release();
mRecorder = null;
record.setEnabled(true);
stop.setEnabled(false);

}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
break;

default:
break;
}
}
}

红色区域出错容易导致 : E/MediaRecorder(9203): start failed: -19,如果出错,可能考虑去除尝试下 。