录制带声音的视频

视频音频的录制和保存

简单效果图

1. 准备工作

配置权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 当前程序需要使用 照相机功能 -->
<uses-feature
        android:name="android.hardware.camera"
        android:required="true" />
<!-- 自定义相机的权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 录音和录像的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 拍照录像 可以包含位置信息 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.FLASHLIGHT" />

2. 布局文件

<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.leejoy.mediarecorder.ImplicitIntentVideoRecordActivity">

    <Button

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnRecordVideoWithIIntent"
        android:text="隐式意图录制视频" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnIntoSurfaceViedo"
        android:text="使用Camera和SurfaceView录制视频"
        />

</LinearLayout>

3. Activity

public class ImplicitIntentVideoRecordActivity extends AppCompatActivity {

    public static final int CAPTURE_VIDEO_REQUEST_CODE = 998;
    private Uri fileUri;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_implicit_intent_video_record);

        intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        File dir = FileUtil.getMediaRecorderFolder(this);
        File targetFile = new File(dir, "audio_video-" + System.currentTimeMillis() + ".mp4");
        fileUri = Uri.fromFile(targetFile);

        //录完直接保存文件 的动作 Action
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);  // set the image file name
        //设置高质量的视频
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high

    }

    public void btnRecordVideoWithIIntent(View view) {
        startActivityForResult(intent, CAPTURE_VIDEO_REQUEST_CODE);
    }

    //接收Intent到达的Activity的返回的数据

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAPTURE_VIDEO_REQUEST_CODE){
            if (resultCode == RESULT_OK){
                // Video captured and saved to fileUri specified in the Intent
                Toast.makeText(this, "Video saved to:\n" +
                        data.getData(), Toast.LENGTH_LONG).show();
            } else if (resultCode == RESULT_CANCELED) {
                // User cancelled the video capture
            } else {
                // Video capture failed, advise user
            }

        }
    }

    public void btnIntoSurfaceViedo(View view) {
        startActivity(new Intent(this,VideoRecordActivity.class));
    }
}

注意: 以上是调用系统自带的录像机

**下面才是本文要介绍的, 也就是一开始的图片效果

一. Activity

public class VideoRecordActivity extends AppCompatActivity{

    private Camera camera;
    private MediaRecorder recorder;
    private boolean isRecording;
    private SurfaceHolder holder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_record);

        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.video_surface_view);

        recorder = new MediaRecorder();

        holder = surfaceView.getHolder();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        recorder.release();
        recorder = null;
    }

    public void btnStartVideoRecord(View view) {
//        //把相机拍摄的内容放到SurfaceView来预览

        camera = Camera.open();
        camera.setDisplayOrientation(90);

//        holder.addCallback(this);

        if (!isRecording) {
            //开始录制
            //1. 解锁相机,然后给媒体录制者加上相机
            camera.unlock();
            recorder.setCamera(camera);

            //2. 设置来源
            recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

            //2.0 设置生成的文件格式
            recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            //2.1 设置声音编码的格式
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            //2.2 设置录音的声道,2代表立体声
            recorder.setAudioChannels(2);
            //2.3 设置声音的位速率;
            int bitRate = 12 * 1024;//12k
//            recorder.setAudioEncodingBitRate(bitRate);
//            recorder.setAudioSamplingRate(bitRate);
            //2.4 设置视频的码率, 编码格式
            int videoRate = 12 * 1024;//12k
//            recorder.setVideoEncodingBitRate(videoRate);
            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

            //3. 设置轮廓
//            recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

            //4. 设置输出路径
            File folder = FileUtil.getMediaRecorderFolder(this);
            File targetFile = new File(folder, "audio_video-" + System.currentTimeMillis() + ".mp4");
            recorder.setOutputFile(targetFile.getAbsolutePath());

            //5. 设置SurfaceView的预览
            recorder.setPreviewDisplay(holder.getSurface());

            //6. 录制前的配置准备
            try {
                recorder.prepare();

                recorder.start();
            } catch (IOException e) {
                e.printStackTrace();
            }

            isRecording = true;
        } else {
            recorder.stop();
            recorder.release();
            camera.lock();
            isRecording = false;
        }
    }


    public void btnStopVideoRecord(View view) {
        //停止录制
        if (isRecording) {
            isRecording = false;
            recorder.stop();
            recorder.reset();
            Toast.makeText(this,"已完成一个视频的录制....",Toast.LENGTH_SHORT).show();
        }
    }

}

FileUtil.class中方法

public static File getMediaRecorderFolder(Context context){
        File ret = null;
        String state = Environment.getExternalStorageState();
        File dir=null;
        if (state.equals(Environment.MEDIA_MOUNTED)){
            //获取公共的照相机储存的文件位置DCIM
            dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

            if (!dir.exists()){
                //获取储存卡中的特定目录
                dir=Environment.getExternalStorageDirectory();
                dir = new File(dir,"MediaRecorder");
                if (!dir.exists()){
                    dir.mkdirs();
                }
            }
        }else{
            //内部储存区
            dir = context.getFilesDir();

        }
//        targetFile = new File(dir, "Image-"+System.currentTimeMillis() + ".jpg");
        ret=dir;
        return ret;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值