Android移动开发-使用摄像头和麦克风录制视频的实现
来源:互联网 发布:青岛java招聘 编辑:程序博客网 时间:2024/05/08 19:50
MediaRecorder除了可用于录制音频之外,还可用于录制视频。使用MediaRecorder录制视频与录制音频的步骤基本相同。只是录制视频时不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int audio_source)方法时再调用setVideoSource(int video_source)方法来设置图像的来源。
除此之外,还需要在调用setOutputFormat()方法设置输出文件格式之后执行如下步骤:
Step1:调用MediaRecorder对象的setVideoEncoder()、setVideoEncodingBitRate(int bitRate)、setVideoFrameRate()方法设置所录制的视频编码格式、编码位率、每秒多少帧等,这些参数可以控制所录制的视频品质、文件大小。一般来说,视频品质越好,视频文件越大;
Step2:调用MediaRecorder的setPreviewDisplay(Surface sv)方法设置使用哪个SurfaceView来显示视频预览。下面的Demo程序示范了如何录制视频,该程序的界面中提供了两个按钮用于控制开始、结束录制;除此之外,程序界面中还提供了一个SurfaceView来显示视频预览。
- layout/activity_main.xml界面布局代码如下:
<?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" android:orientation="vertical"> <!-- 显示视频预览的SurfaceView --> <SurfaceView android:id="@+id/sView" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:gravity="center_horizontal" android:orientation="horizontal"> <ImageButton android:id="@+id/record" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/record" /> <ImageButton android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/stop" /> </LinearLayout></RelativeLayout>
提供了上面的所示的界面布局文件之后,接下来就可以在程序中使用MediaRecorder来录制视频了。录制视频与录制音频的步骤基本相似,只是需要额外设置视频的图像来源、视频格式等等。除此之外,还需要设置使用SurfaceView显示视频预览。
- MainActivity.java逻辑代码如下:
package com.fukaimei.recordvideo;import android.app.Activity;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageButton;import android.widget.Toast;import java.io.File;public class MainActivity extends Activity implements OnClickListener { private static final String TAG = "MainActivity"; // 程序中的两个按钮 ImageButton record, stop; // 系统的视频文件 File videoFile; MediaRecorder mRecorder; // 显示视频预览的SurfaceView SurfaceView sView; // 记录是否正在进行录制 private boolean isRecording = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取程序界面中的两个按钮 record = (ImageButton) findViewById(R.id.record); stop = (ImageButton) findViewById(R.id.stop); // 让stop按钮不可用 stop.setEnabled(false); // 为两个按钮的单击事件绑定监听器 record.setOnClickListener(this); stop.setOnClickListener(this); // 获取程序界面中的SurfaceView sView = (SurfaceView) this.findViewById(R.id.sView); // 设置分辨率 sView.getHolder().setFixedSize(1920, 1080); // 1080P // 设置该组件让屏幕不会自动关闭 sView.getHolder().setKeepScreenOn(true); } @Override public void onClick(View v) { // 单击录制按钮 if (v.getId() == R.id.record) { if (!Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { Toast.makeText(MainActivity.this, "SD卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show(); return; } try { // 创建保存录制视频的视频文件 videoFile = new File(Environment.getExternalStorageDirectory() .getCanonicalFile() + "/my_video.mp4"); // 创建MediaPlayer对象 mRecorder = new MediaRecorder(); mRecorder.reset(); // 设置从麦克风采集声音 mRecorder.setAudioSource(MediaRecorder .AudioSource.MIC); // 设置从摄像头采集图像 mRecorder.setVideoSource(MediaRecorder .VideoSource.CAMERA); // 设置视频文件的输出格式 // 必须在设置声音编码格式、图像编码格式之前设置 mRecorder.setOutputFormat(MediaRecorder .OutputFormat.MPEG_4); // 设置声音编码的格式 mRecorder.setAudioEncoder(MediaRecorder .AudioEncoder.DEFAULT); // 设置图像编码的格式 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); mRecorder.setVideoSize(1920, 1080); // 1080P // 每秒16帧 mRecorder.setVideoFrameRate(16); mRecorder.setOutputFile(videoFile.getAbsolutePath()); // 指定使用SurfaceView来预览视频 mRecorder.setPreviewDisplay(sView.getHolder().getSurface()); // ① mRecorder.prepare(); // 开始录制 mRecorder.start(); Log.d(TAG, "---recording---"); // 让record按钮不可用 record.setEnabled(false); // 让stop按钮可用 stop.setEnabled(true); isRecording = true; } catch (Exception e) { e.printStackTrace(); } } else if (v.getId() == R.id.stop) { // 单击停止按钮 // 如果正在进行录制 if (isRecording) { // 停止录制 mRecorder.stop(); // 释放资源 mRecorder.release(); mRecorder = null; // 让record按钮可用 record.setEnabled(true); // 让stop按钮不可用 stop.setEnabled(false); } } }}
上面的代码设置了视频所采集的图像的来源,以及视频的压缩格式、视频分辨率等属性,标序号①的代码则用于设置使用指定SurfaceView显示指定视频预览。
- 注意:由于该程序需要使用系统的麦克风进行录音、需要使用摄像头采集图像以及保存文件到外部存储卡,因此还需要在清单文件AndroidManifest.xml文件中授权相应的权限:
<!-- 授予该程序录制声音的权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 授予该程序使用摄像头的权限 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 授予使用外部存储器的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- Demo程序运行效果界面截图如下:
Demo程序源码下载地址
- Android移动开发-使用摄像头和麦克风录制视频的实现
- Android移动开发-使用MediaRecorder录制音频的实现
- iOS拍照和录制视频 摄像头使用
- 4.使用DShow采集摄像头图像和麦克风声音到本地(摄像头录制)
- [FFmpeg] 输入设备 dshow 的使用——用电脑摄像头和麦克风录视频
- Android移动开发-使用VideoView播放视频的实现
- 摄像头/麦克风的视频/音量指示器
- Android移动开发-使用MediaPlayer和SurfaceView播放视频的实现
- FFmpeg 录制桌面、麦克风、摄像头
- 关于Android 使用MediaRecorder实现录制视频开始暂停和结束功能的说明
- Android开发之使用MediaRecorder录制视频
- Android开发之使用MediaRecorder录制视频
- Android移动开发-调用摄像头进行拍照的实现
- Android 拍照和视频录制实现mediaRecorder
- 【视频开发】用GStreamer实现摄像头的采集和保存
- android实现视频录制
- android录制视频实现
- Android实现录制视频
- C++之编码问题(Unicode,ASCII,本地默认)
- Codeforces 230C Shifts【思维】
- 《Deep Self-Taught Learning for Weakly Supervised Object Localization》
- Python数据挖掘入门与实践(二)——用scikit-learn估计器分类
- 程序设计中的堆和栈
- Android移动开发-使用摄像头和麦克风录制视频的实现
- Zookeeper的功能以及工作原理
- apache服务器开启Gzip压缩服务
- Scratch2.0编程--第十一节 运算符
- Java基础 -- 线程
- 2017/9/30 学习笔记
- python基础(一)--join和os.path.join函数的用法以及字符串格式化
- 51nod1013 3的幂的和 (矩阵快速幂 或 逆元+快速幂)
- AHB总线协议