我的Android进阶之旅------>Android视频录制小例子

简介: ============================首先看看官网上关于视频捕捉的介绍================================ Capturing videos Video capture using the An...



============================首先看看官网上关于视频捕捉的介绍================================

Capturing videos

Video capture using the Android framework requires careful management of the Camera object and coordination with the MediaRecorder class. When recording video with Camera, you must manage the Camera.lock() andCamera.unlock() calls to allow MediaRecorder access to the camera hardware, in addition to the Camera.open()and Camera.release() calls.

Note: Starting with Android 4.0 (API level 14), the Camera.lock() and Camera.unlock() calls are managed for you automatically.

Unlike taking pictures with a device camera, capturing video requires a very particular call order. You must follow a specific order of execution to successfully prepare for and capture video with your application, as detailed below.

  1. Open Camera - Use the Camera.open() to get an instance of the camera object.
  2. Connect Preview - Prepare a live camera image preview by connecting a SurfaceView to the camera usingCamera.setPreviewDisplay().
  3. Start Preview - Call Camera.startPreview() to begin displaying the live camera images.
  4. Start Recording Video - The following steps must be completed in order to successfully record video:
    1. Unlock the Camera - Unlock the camera for use by MediaRecorder by calling Camera.unlock().
    2. Configure MediaRecorder - Call in the following MediaRecorder methods in this order. For more information, see the MediaRecorder reference documentation.
      1. setCamera() - Set the camera to be used for video capture, use your application's current instance ofCamera.
      2. setAudioSource() - Set the audio source, use MediaRecorder.AudioSource.CAMCORDER.
      3. setVideoSource() - Set the video source, use MediaRecorder.VideoSource.CAMERA.
      4. Set the video output format and encoding. For Android 2.2 (API Level 8) and higher, use theMediaRecorder.setProfile method, and get a profile instance using CamcorderProfile.get(). For versions of Android prior to 2.2, you must set the video output format and encoding parameters:
        1. setOutputFormat() - Set the output format, specify the default setting orMediaRecorder.OutputFormat.MPEG_4.
        2. setAudioEncoder() - Set the sound encoding type, specify the default setting orMediaRecorder.AudioEncoder.AMR_NB.
        3. setVideoEncoder() - Set the video encoding type, specify the default setting orMediaRecorder.VideoEncoder.MPEG_4_SP.
      5. setOutputFile() - Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() from the example method in the Saving Media Files section.
      6. setPreviewDisplay() - Specify the SurfaceView preview layout element for your application. Use the same object you specified for Connect Preview.

      Caution: You must call these MediaRecorder configuration methods in this order, otherwise your application will encounter errors and the recording will fail.

    3. Prepare MediaRecorder - Prepare the MediaRecorder with provided configuration settings by callingMediaRecorder.prepare().
    4. Start MediaRecorder - Start recording video by calling MediaRecorder.start().
  5. Stop Recording Video - Call the following methods in order, to successfully complete a video recording:
    1. Stop MediaRecorder - Stop recording video by calling MediaRecorder.stop().
    2. Reset MediaRecorder - Optionally, remove the configuration settings from the recorder by callingMediaRecorder.reset().
    3. Release MediaRecorder - Release the MediaRecorder by calling MediaRecorder.release().
    4. Lock the Camera - Lock the camera so that future MediaRecorder sessions can use it by callingCamera.lock(). Starting with Android 4.0 (API level 14), this call is not required unless theMediaRecorder.prepare() call fails.
  6. Stop the Preview - When your activity has finished using the camera, stop the preview usingCamera.stopPreview().
  7. Release Camera - Release the camera so that other applications can use it by calling Camera.release().

Note: It is possible to use MediaRecorder without creating a camera preview first and skip the first few steps of this process. However, since users typically prefer to see a preview before starting a recording, that process is not discussed here.

Tip: If your application is typically used for recording video, set setRecordingHint(boolean) to true prior to starting your preview. This setting can help reduce the time it takes to start recording.


============================再看看官网上关于音频捕捉的介绍================================

Audio Capture

The Android multimedia framework includes support for capturing and encoding a variety of common audio formats, so that you can easily integrate audio into your applications. You can record audio using the MediaRecorder APIs if supported by the device hardware.

This document shows you how to write an application that captures audio from a device microphone, save the audio and play it back.

Note: The Android Emulator does not have the ability to capture audio, but actual devices are likely to provide these capabilities.

Performing Audio Capture

Audio capture from the device is a bit more complicated than audio and video playback, but still fairly simple:

  1. Create a new instance of android.media.MediaRecorder.
  2. Set the audio source using MediaRecorder.setAudioSource(). You will probably want to useMediaRecorder.AudioSource.MIC.
  3. Set output file format using MediaRecorder.setOutputFormat().
  4. Set output file name using MediaRecorder.setOutputFile().
  5. Set the audio encoder using MediaRecorder.setAudioEncoder().
  6. Call MediaRecorder.prepare() on the MediaRecorder instance.
  7. To start audio capture, call MediaRecorder.start().
  8. To stop audio capture, call MediaRecorder.stop().
  9. When you are done with the MediaRecorder instance, call MediaRecorder.release() on it. CallingMediaRecorder.release() is always recommended to free the resource immediately.


下面就看看该小例子的代码吧。

文件1.该应用的布局文件,res/layout/main.xml

<!-- 帧布局 -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent">
	
	<!-- 用来展示画面 -->
	<SurfaceView android:id="@+id/surfaceView"
		android:layout_width="fill_parent" android:layout_height="fill_parent" />
	
	<!-- 相对布局,该界面默认不显示出来,当触摸屏幕时候显示出来 -->
	<RelativeLayout android:layout_width="fill_parent"
		android:layout_height="fill_parent" android:visibility="gone"
		android:id="@+id/buttonlayout">
		<!-- 刻录按钮 -->
		<Button android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:layout_alignParentRight="true"
			android:layout_alignParentBottom="true" android:layout_marginRight="10dp"
			android:text="@string/recoderbutton" android:onClick="recoder"
			android:id="@+id/recoderbutton" />
		<!-- 停止按钮 -->
		<Button android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:layout_toLeftOf="@id/recoderbutton"
			android:layout_alignTop="@id/recoderbutton" android:layout_marginRight="30dp"
			android:text="@string/stopbutton" android:onClick="stop"
			android:id="@+id/stopbutton" 
			android:enabled="false"/>
	</RelativeLayout>
</FrameLayout>

文件 2:布局文件所用到的资源文件,res/values/string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, RecoderActivity!</string>
    <string name="app_name">视频刻录小例子</string>
    <string name="recoderbutton">刻录</string>
    <string name="stopbutton">停止</string>
    <string name="noSDcard">检测到手机没有存储卡!请插入手机存储卡再开启本应用</string>
    <string name="maxDuration">已经达到最长录制时间</string>
</resources>

  文件 3:该应用的主程序,RecoderActivity.java

package cn.oyp.recoder;

import java.io.File;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnInfoListener;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class RecoderActivity extends Activity {
	// 用来显示图片
	private SurfaceView surfaceView;
	// 刻录和停止按钮布局
	private RelativeLayout buttonlayout;
	// 刻录按钮
	private Button recoderbutton;
	// 停止按钮
	private Button stopbutton;
	// 媒体刻录对象
	private MediaRecorder mediaRecorder;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 窗口特效为无标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 设置窗口全屏
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		// 设定屏幕显示为横向
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		setContentView(R.layout.main);

		buttonlayout = (RelativeLayout) this.findViewById(R.id.buttonlayout);
		recoderbutton = (Button) this.findViewById(R.id.recoderbutton);
		stopbutton = (Button) this.findViewById(R.id.stopbutton);

		surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
		// 获取的画面直接输出到屏幕上
		surfaceView.getHolder()
				.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		// 画面分辨率
		surfaceView.getHolder().setFixedSize(176, 144);
		// 保持屏幕高亮
		surfaceView.getHolder().setKeepScreenOn(true);
	}

	// 点击刻录按钮处理方法
	public void recoder(View v) {
		try {
			// 判断是否存在SD卡
			if (Environment.getExternalStorageState().equals(
					Environment.MEDIA_MOUNTED)) {
				// 将刻录的视频保存到SD卡中
				File videoFile = new File(
						Environment.getExternalStorageDirectory(),
						System.currentTimeMillis() + ".3gp");
				mediaRecorder = new MediaRecorder();
				// 设置声音采集来源于麦克风
				mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
				// 设置视频采集来源于摄像头
				mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
				// 设置输出格式为3gp
				mediaRecorder
						.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
				// 设置视频尺寸
				mediaRecorder.setVideoSize(surfaceView.getWidth(),
						surfaceView.getHeight());
				// 设置每秒钟捕捉画面个数为5帧
				mediaRecorder.setVideoFrameRate(5);
				// 设置声音编码
				mediaRecorder
						.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
				// 设置视频编码
				mediaRecorder.setAudioEncoder(MediaRecorder.VideoEncoder.H264);
				// 设置视频的最大持续时间
				mediaRecorder.setMaxDuration(10000);
				mediaRecorder.setOnInfoListener(new OnInfoListener() {
					@Override
					public void onInfo(MediaRecorder mr, int what, int extra) {
						if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
							Toast.makeText(getApplicationContext(),
									R.string.maxDuration, Toast.LENGTH_LONG)
									.show();
							if (mediaRecorder != null) {
								mediaRecorder.stop();
								mediaRecorder.release();
								mediaRecorder = null;
							}
						}
					}
				});
				// 设置刻录的视频保存路径
				mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
				// 设置预览显示
				mediaRecorder.setPreviewDisplay(surfaceView.getHolder()
						.getSurface());
				// 预期准备
				mediaRecorder.prepare();
				// 开始刻录
				mediaRecorder.start();
			} else {
				Toast.makeText(getApplicationContext(), R.string.noSDcard,
						Toast.LENGTH_LONG).show();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 刻录按钮不可点击
		recoderbutton.setEnabled(false);
		// 停止按钮可点击
		stopbutton.setEnabled(true);
	}

	// 点击停止按钮处理方法
	public void stop(View v) {
		// 停止刻录,并释放资源
		if (mediaRecorder != null) {
			mediaRecorder.stop();
			mediaRecorder.release();
			mediaRecorder = null;
		}
		// 刻录按钮可点击
		recoderbutton.setEnabled(true);
		// 停止按钮不可点击
		stopbutton.setEnabled(false);
	}

	/** 当触摸屏幕的时候,将对焦和拍照按钮布局显示出来 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			buttonlayout.setVisibility(ViewGroup.VISIBLE);
			return true;
		}
		return super.onTouchEvent(event);
	}

}

文件 4:该应用的描述文件 ,AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="cn.oyp.recoder" android:versionCode="1" android:versionName="1.0">
	<uses-sdk android:minSdkVersion="8" />

	<!-- 摄像头权限 -->
	<uses-permission android:name="android.permission.CAMERA" />
	<!-- 录制音频权限 -->
	<uses-permission android:name="android.permission.RECORD_AUDIO"/>
	<!-- 在SD卡中创建和删除文件权限 -->
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
	<!-- 往SD卡中写入数据的权限 -->
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	

	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".RecoderActivity" android:label="@string/app_name"
			android:screenOrientation="landscape">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>

	</application>
</manifest>

=================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

==================================================================================================

相关文章
|
6月前
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
60 3
|
7月前
|
API Android开发
Android高手进阶教程(十五)之---通过Location获取Address的使用!
Android高手进阶教程(十五)之---通过Location获取Address的使用!
68 1
|
4月前
|
编解码 监控 API
惊艳登场!揭秘如何在Android平台上轻松玩转GB28181标准,实现多视频通道接入的超实用指南!
【8月更文挑战第14天】GB28181是公共安全视频监控联网的技术标准。本文介绍如何在Android平台上实现该标准下的多视频通道接入。首先准备开发环境,接着引入GB28181 SDK依赖并初始化SDK。实现设备注册与登录后,通过指定不同通道号请求多路视频流。最后,处理接收到的数据并显示给用户。此过程涉及视频解码,需确保应用稳定及良好的用户体验。
63 0
|
6月前
|
监控 Android开发 数据安全/隐私保护
安卓kotlin JetPack Compose 实现摄像头监控画面变化并录制视频
在这个示例中,开发者正在使用Kotlin和Jetpack Compose构建一个Android应用程序,该程序 能够通过手机后置主摄像头录制视频、检测画面差异、实时预览并将视频上传至FTP服务器的Android应用
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
48 2
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
56 0
|
6月前
|
存储 编解码 Android开发
58. 【Android教程】音频录制:MediaRecord
58. 【Android教程】音频录制:MediaRecord
62 2
|
6月前
|
存储 算法 Java
Android 进阶——代码插桩必知必会&ASM7字节码操作
Android 进阶——代码插桩必知必会&ASM7字节码操作
253 0
|
7月前
|
缓存 网络协议 Java
挑战全网,史上最全Android开发进阶,跳槽复习指南(1),掌握这6大技能体系
挑战全网,史上最全Android开发进阶,跳槽复习指南(1),掌握这6大技能体系
|
7月前
|
Android开发 内存技术
Android 通过tinyalsa调试解决录制和播放音频问题
Android 通过tinyalsa调试解决录制和播放音频问题
240 1