Android多媒体视频——MediaRecorder&MediaPlayer

MediaRecorder可以实现音频和视频的录制,录制视频首先需要渲染一个SurfaceView用以展示预览,接着便可以通过MediaRecorder录制视频文件了。MediaPlayer可实现播放视频。


MediaRecorder录制视频的步骤

  1. 获得MediaRecorder对象
  2. 设置录制设备
  3. 设置输出格式
  4. 设置录制大小(非必须)(和录制视频的清晰度有关)
  5. 设置录制帧率(非必须)
  6. 设置压缩格式
  7. 设置输出文件
  8. 准备录制
  9. 开始录制
  10. 停止录制
  11. 释放资源
    录制时一定要先设置录制源,其次设置输出格式;接着如果要设置大小必须在编码之前,否则设置会失效。

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(25);//设置帧率,部分设备无效
        recorder.setVideoSize(800, 480);//设置视频大喜,必须在编码之前,否则无效
        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);

    }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值