Android系统自带的MediaRecorder结合Camera实现视频录制及播放功能。

 简单的视频录制播放小功能:

layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SurfaceView
        android:id="@+id/surfaceview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="60dp" />

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="60dp"
        android:scaleType="centerCrop" />

    <Button
        android:id="@+id/btnStartStop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:onClick="onStartStopPlay"
        android:text="开始/结束录制" />

    <Button
        android:id="@+id/btnPlayVideo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="20dp"
        android:layout_toRightOf="@id/btnStartStop"
        android:onClick="onStartStopPlay"
        android:text="播放" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="20dp"
        android:layout_marginBottom="12dp"
        android:text="00:00"
        android:textSize="25sp" />
</RelativeLayout>

activity:

package com.example.goujin_sever.facedome.ui;

import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.goujin_sever.facedome.R;

import java.io.File;
import java.util.Calendar;

public class TestVideoActivity extends AppCompatActivity implements SurfaceHolder.Callback {
    private SurfaceView mSurfaceview;
    private ImageView mImageView;
    private Button mBtnStartStop;
    private Button mBtnPlay;
    private TextView mTextView;
    private boolean mIsPlay = false;//是否正在播放
    private boolean mStartedFlg = false;//是否正在录像
    private MediaPlayer mediaPlayer;//多媒体播放器
    private int text = 0;
    private MediaRecorder mRecorder;//多媒体录音
    private Camera mCamera;//相机
    private String path;//视频保存路径
    private SurfaceHolder mSurfaceHolder;
    private android.os.Handler handler = new android.os.Handler();//android.os 是一个移动设备,智能手机和平板电脑的操作系统
    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            text++;
            mTextView.setText(text + "");
            handler.postDelayed(this, 1000);//休眠1秒
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        setContentView(R.layout.activity_test_video);
        intView();
        SurfaceHolder holder = mSurfaceview.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//缓冲区
    }

    @Override
    protected void onResume() {
        super.onResume();  /* if (!mStartedFlg) {  mImageView.setVisibility(View.GONE);  }*/
    }

    private void intView() {
        mSurfaceview = (SurfaceView) findViewById(R.id.surfaceview);
        mImageView = (ImageView) findViewById(R.id.imageview);
        mBtnStartStop = (Button) findViewById(R.id.btnStartStop);
        mBtnPlay = (Button) findViewById(R.id.btnPlayVideo);
        mTextView = (TextView) findViewById(R.id.text);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mSurfaceHolder = holder;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mSurfaceHolder = holder;
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mSurfaceview = null;
        mSurfaceHolder = null;
        handler.removeCallbacks(runnable);
        if (mRecorder != null) {
            mRecorder.release();
            mRecorder = null;
        }
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    public void onStartStopPlay(View view) {
        switch (view.getId()) {
            case R.id.btnStartStop:
                if (mIsPlay) {
                    if (mediaPlayer != null) {
                        mIsPlay = false;
                        mediaPlayer.stop();//停止媒体播放器
                        mediaPlayer.reset();//重置媒体播放器
                        mediaPlayer.release();//释放资源
                        mediaPlayer = null;
                    }
                } //如果正在录像
                if (!mStartedFlg) {
                    handler.postDelayed(runnable, 1000);
                    mImageView.setVisibility(View.GONE);
                    if (mRecorder == null) {
                        mRecorder = new MediaRecorder();
                    }
                    mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
                    if (mCamera != null) {
                        mCamera.setDisplayOrientation(90);
                        mCamera.unlock();
                        mRecorder.setCamera(mCamera);
                    }
                    try { // 这两项需要放在setOutputFormat之前,设置音频和视频的来源
                        mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//摄录像机
                        mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//相机   // Set output file format
                        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//输出格式 mp4   // 这两项需要放在setOutputFormat之后 设置编码器
                        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码格式
                        mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);//视频编码格式
                        mRecorder.setVideoSize(640, 480);//视频分辨率
                        mRecorder.setVideoFrameRate(30);//帧速率
                        mRecorder.setVideoEncodingBitRate(3 * 1024 * 1024);//视频清晰度
                        mRecorder.setOrientationHint(90);//输出视频播放的方向提示  //设置记录会话的最大持续时间(毫秒)
                        mRecorder.setMaxDuration(30 * 1000);
                        mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());//预览显示的控件
                        path = getSDPath();
                        if (path != null) {
                            File dir = new File(path + "/recordtest");
                            if (!dir.exists()) {//如果不存在这个文件,则创建。
                                dir.mkdir();
                            }
                            path = dir + "/" + getDate() + ".mp4";
                            mRecorder.setOutputFile(path);//输出文件路径
                            mRecorder.prepare();//准备
                            mRecorder.start();//开始
                            mStartedFlg = true;//录像开始
                            mBtnStartStop.setText("结束录制");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } //停止
                else {
                    if (mStartedFlg) {
                        handler.removeCallbacks(runnable);
                        mRecorder.stop();//停止
                        mRecorder.reset();//重置,设置为空闲状态
                        mRecorder.release();//释放
                        mRecorder = null;
                        mBtnStartStop.setText("开始录制");
                        text = 0;  //释放相机
                        if (mCamera != null) {
                            mCamera.release();
                            mCamera = null;
                        }
                    }
                    mStartedFlg = false;
                }
                break;
            case R.id.btnPlayVideo:
                if (mStartedFlg) {
                    Toast.makeText(TestVideoActivity.this, "正在录制,请结束录制再播放", Toast.LENGTH_SHORT).show();
                } else {

                    if (mediaPlayer == null) {
                        mediaPlayer = new MediaPlayer();
                    }
                    mediaPlayer.reset();
                    if (path == null) {
                        Toast.makeText(TestVideoActivity.this, "暂无视频资源", Toast.LENGTH_SHORT).show();
                    } else {
                        mImageView.setVisibility(View.GONE);
                        Uri uri = Uri.parse(path);
                        mediaPlayer = MediaPlayer.create(TestVideoActivity.this, uri);
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                        mediaPlayer.setDisplay(mSurfaceHolder);//设置显示的控件
                        try {
                            mediaPlayer.prepare();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                  /*  int currentPosition = mediaPlayer.getCurrentPosition();
                    int duration = mediaPlayer.getDuration();
                    Log.i("time",currentPosition+"---"+duration);*/
                        mediaPlayer.start();
                        mBtnPlay.setText("暂停");
                        //监听播放器是否播放结束
                        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            @Override
                            public void onCompletion(MediaPlayer mp) {
                                mImageView.setVisibility(View.VISIBLE);
                                mBtnPlay.setText("播放");
                                Toast.makeText(TestVideoActivity.this, "播放完毕",
                                        Toast.LENGTH_SHORT).show();
                            }
                        });

                    }
                }
                break;
        }
    }

    //获取系统时间 视频保存的时间
    public static String getDate() {
        Calendar mCalendar = Calendar.getInstance();
        int year = mCalendar.get(Calendar.YEAR);
        int month = mCalendar.get(Calendar.MONTH);
        int day = mCalendar.get(Calendar.DATE);
        int hour = mCalendar.get(Calendar.HOUR);
        int minute = mCalendar.get(Calendar.MINUTE);
        int second = mCalendar.get(Calendar.SECOND);
        String date = "" + year + (month + 1) + day + hour + minute + second;
        Log.d("date", "date:" + date);
        return date;
    }

    //获取SD卡路径
    public String getSDPath() {
        File sdDir = null;
        // 判断sd卡是否存在
        boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (sdCardExist) {
            sdDir = Environment.getExternalStorageDirectory();//获取根目录
            return sdDir.toString();
        }
        return null;
    }
}

  

  另外不要忘了添加下面权限

<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.CAMERA" >
</uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
参考链接http://www.cnblogs.com/Amandaliu/archive/2013/02/04/2891604.html 在链接内容基础上修改了amr编码格式为aac编码格式 Android提供了两个API用于实现录音功能android.media.AudioRecord、android.media.MediaRecorder。 网上有很多谈论这两个类的资料。现在大致总结下: 1、AudioRecord 主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音) 优点:语音的实时处理,可以用代码实现各种音频的封装 缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放播放的,所以必须先写代码实现数据编码以及压缩 示例: 使用AudioRecord类录音,并实现WAV格式封装。录音20s,输出的音频文件大概为3.5M左右(已写测试代码) 2、MediaRecorder 已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp 优点:大部分以及集成,直接调用相关接口即可,代码量小 缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件 示例: 使用MediaRecorder类录音,输出amr格式文件。录音20s,输出的音频文件大概为33K(已写测试代码) 3、音频格式比较 WAV格式:录音质量高,但是压缩率小,文件大 AAC格式:相对于mp3,AAC格式的音质更佳,文件更小;有损压缩;一般苹果或者Android SDK4.1.2(API 16)及以上版本支持播放 AMR格式:压缩比比较大,但相对其他的压缩格式质量比较差,多用于人声,通话录音 至于常用的mp3格式,使用MediaRecorder没有该视频格式输出。一些人的做法是使用AudioRecord录音,然后编码成wav格式,再转换成mp3格式 再贴上一些测试工程。 功能描述: 1、点击“录音WAV文件”,开始录音。录音完成后,生成文件/sdcard/FinalAudio.wav 2、点击“录音AMR文件”,开始录音。录音完成后,生成文件/sdcard/FinalAudio.amr 3、点击“停止录音”,停止录音,并显示录音输出文件以及该文件大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值