目录
1.使用MediaRecorder录制视频
运行结果
实现代码
MediaRecordActivity.java
package com.example.mediademo; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.widget.Button; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import java.io.File; import java.io.IOException; public class MediaRecordActivity extends AppCompatActivity implements View.OnClickListener{ private TextureView textureView; private Button btn_opt; private MediaRecorder mediaRecorder; private Camera camera; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_record); btn_opt = findViewById(R.id.btn_opt); textureView = findViewById(R.id.texture1); btn_opt.setOnClickListener(this); } @RequiresApi(api = Build.VERSION_CODES.O) @Override public void onClick(View v) { CharSequence text = btn_opt.getText(); if (TextUtils.equals(text,"开始")){ btn_opt.setText("结束"); // 将预览视频设置为正常的 不然会颠倒 camera = Camera.open(); camera.setDisplayOrientation(90); camera.unlock(); mediaRecorder = new MediaRecorder(); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频源 麦克风 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 设备视频源 摄像头 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 指定视频文件格式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 将视频输出文件设置为正常的 不然会颠倒 mediaRecorder.setOrientationHint(90); // 设置视频输出文件 mediaRecorder.setOutputFile(new File(getExternalFilesDir(""), "a.mp4").getAbsoluteFile()); mediaRecorder.setVideoSize(640,480); mediaRecorder.setPreviewDisplay(new Surface(textureView.getSurfaceTexture())); try { mediaRecorder.prepare(); } catch (IOException e){ e.printStackTrace(); } mediaRecorder.start(); } else{ btn_opt.setText("开始"); mediaRecorder.stop(); mediaRecorder.release(); camera.stopPreview(); camera.release(); } } }
布局代码:activity_record
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <TextureView android:id="@+id/texture1" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/btn_opt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="70dp" android:text="开始" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
记得在主activity中获取权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO}, 100);
同时在AndroidManifest.xml中添加下述权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" />
2. 对于MediaRecorder使用流程进行简单介绍
初始化
private MediaRecorder mediaRecorder; mediaRecorder = new MediaRecorder();
设置音频源 视频源和文件格式
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频源 麦克风 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 设备视频源 摄像头 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 指定视频文件格式
设置编码
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
设置视频输出文件 VideoSize
mediaRecorder.setOutputFile(new File(getExternalFilesDir(""), "a.mp4").getAbsoluteFile()); mediaRecorder.setVideoSize(640,480); mediaRecorder.setPreviewDisplay(new Surface(textureView.getSurfaceTexture()));
准备开始
try { mediaRecorder.prepare(); } catch (IOException e){ e.printStackTrace(); } mediaRecorder.start();
结束
mediaRecorder.stop(); mediaRecorder.release();
直接使用由于Android摄像头的特性 会发现预览视频和实际视频会颠倒
解决方法
设置预览视频
// 将预览视频设置为正常的 不然会颠倒 camera = Camera.open(); camera.setDisplayOrientation(90); mediaRecorder.setCamera(camera);
设置视频输出文件
// 将视频输出文件设置为正常的 不然会颠倒 mediaRecorder.setOrientationHint(90);
最后要记得结束的时候Camera关闭 不然第二次或者多次打开的时候会报错
camera.stopPreview(); camera.release();