MediaRecorder可以实现音频和视频的录制,录制视频首先需要渲染一个SurfaceView用以展示预览,接着便可以通过MediaRecorder录制视频文件了。MediaPlayer可实现播放视频。
MediaRecorder录制视频的步骤
- 获得MediaRecorder对象
- 设置录制设备
- 设置输出格式
- 设置录制大小(非必须)(和录制视频的清晰度有关)
- 设置录制帧率(非必须)
- 设置压缩格式
- 设置输出文件
- 准备录制
- 开始录制
- 停止录制
-
释放资源
录制时一定要先设置录制源,其次设置输出格式;接着如果要设置大小必须在编码之前,否则设置会失效。
public class MainActivity extends Activity implements SurfaceHolder.Callback {
//录制视频变量
SurfaceView sv;
SurfaceHolder holder;
Button recordVedio;
Button stopRecordVedio;
MediaRecorder recorder;
String path="/sdcard/shipin.3gp";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ininView();
//录制视频
recordVedio.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
initRecorder();//初始化录制器
record();//开始录制
}
});
stopRecordVedio.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
recorder.stop();
recorder.release();
}
});
}
//视图初始化
private void ininView() {
// TODO 自动生成的方法存根
sv=(SurfaceView)findViewById(R.id.surfaceView1);
recordVedio=(Button)findViewById(R.id.button1);
stopRecordVedio=(Button)findViewById(R.id.button2);
holder=sv.getHolder();
}
//初始化播放器
protected void initRecorder() {
// TODO 自动生成的方法存根
recorder=new MediaRecorder();
recorder.setPreviewDisplay(holder.getSurface());//获得surface对象
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置录制源
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式
recorder.setVideoFrameRate();//设置帧率,部分设备无效
recorder.setVideoSize(, );//设置视频大喜,必须在编码之前,否则无效
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置编码格式
recorder.setOutputFile(path);//设置输出文件
}
//开始录制
protected void record() {
// TODO 自动生成的方法存根
try
{
recorder.prepare();
recorder.start();
}
catch(Exception e){
e.printStackTrace();
}
}
}
别忘了在注册文件中添加权限:
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
MediaPlayer播放视频
使用SurfaceView完成视频的显示。进行视频播放的步骤为:
1. 获得MediaPlayer对象
2. 绑定播放组件
3. 设置数据源
4. 准备播放
5. 开始播放
6. 暂停播放
7. 停止播放
8. 释放资源
public class MainActivity extends Activity implements SurfaceHolder.Callback {
SurfaceView sv;
SurfaceHolder holder;
//播放视频变量
Button playVedio;
Button stopPlayVedio;
Button pausePlayVedio;
MediaPlayer player;
boolean isPrepared=false;
boolean isPlaying=false;
String path="/sdcard/shipin.3gp";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ininView();//视图初始化
//播放视频
initPlayer();//初始化播放器
playVedio.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
if(!isPlaying)
{
play();//播放
isPlaying=true;
}
}
});
stopPlayVedio.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
if(player.isPlaying())
{
player.stop();
isPrepared=false;
}
isPlaying=false;
player.release();//释放资源后便不能再启动播放,不执行释放,停止后还可以启动播放
}
});
pausePlayVedio.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
if(isPlaying)
{
player.pause();
isPlaying=false;
}
}
});
}
//初始化播放器
private void initPlayer() {
// TODO 自动生成的方法存根
player=new MediaPlayer(); //获得播放器对象
//player.setDisplay(holder); //绑定显示组件,在player.start之前设置显示参数,所用的版本会提示错我
try
{
player.setDataSource(path);//设置数据源
}
catch (IllegalArgumentException e) {
// TODO: handle exception
e.printStackTrace();
}
catch (IllegalStateException e) {
// TODO: handle exception
e.printStackTrace();
}
catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
protected void play() {
// TODO 自动生成的方法存根
try{
if(!isPrepared)
{
player.prepare();
isPrepared=true;
}
player.start();
//最好保证mediaPlayer.start()之后,在进行mediaPlayer.setDisplay()的设置,不过一般问题不大。
//有时候会遇到只有声音没有图像的情况,那是因为surfaceview的创建优先级并不高,因此在mediaPlayer开始之后,
//surfaceView还没有创建出来,因此会出现有声音没图像的问题
player.setDisplay(holder); //绑定显示组件
//监听是否播放完成
player.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO 自动生成的方法存根
isPlaying=false;//播放完成,则设置参数
}
});
}
catch(Exception e){
e.printStackTrace();
}
}
private void ininView() {
// TODO 自动生成的方法存根
sv=(SurfaceView)findViewById(R.id.surfaceView1);
holder=sv.getHolder();
playVedio=(Button)findViewById(R.id.button3);
stopPlayVedio=(Button)findViewById(R.id.button4);
pausePlayVedio=(Button)findViewById(R.id.button5);
}
}