============================首先看看官网上关于视频捕捉的介绍================================
Capturing videos
Video capture using the Android framework requires careful management of theCamera
object
and coordination with theMediaRecorder
class.
When recording video withCamera
,
you must manage theCamera.lock()
andCamera.unlock()
calls
to allowMediaRecorder
access
to the camera hardware, in addition to theCamera.open()
andCamera.release()
calls.
Note:Starting with Android 4.0 (API level 14), theCamera.lock()
andCamera.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.
-
Open Camera- Use the
Camera.open()
to
get an instance of the camera object.
-
Connect Preview- Prepare a live camera image preview by connecting a
SurfaceView
to
the camera usingCamera.setPreviewDisplay()
.
-
Start Preview- Call
Camera.startPreview()
to
begin displaying the live camera images.
-
Start Recording Video- The following steps must be completedin orderto successfully record video:
-
Unlock the Camera- Unlock the camera for use by
MediaRecorder
by
callingCamera.unlock()
.
-
Configure MediaRecorder- Call in the following
MediaRecorder
methodsin
this order. For more information, see theMediaRecorder
reference
documentation.
-
setCamera()
-
Set the camera to be used for video capture, use your application's current instance ofCamera
.
-
setAudioSource()
-
Set the audio source, useMediaRecorder.AudioSource.CAMCORDER
.
-
setVideoSource()
-
Set the video source, useMediaRecorder.VideoSource.CAMERA
.
- Set the video output format and encoding. For Android 2.2 (API Level 8) and higher, use the
MediaRecorder.setProfile
method,
and get a profile instance usingCamcorderProfile.get()
.
For versions of Android prior to 2.2, you must set the video output format and encoding parameters:
-
setOutputFormat()
-
Set the output format, specify the default setting orMediaRecorder.OutputFormat.MPEG_4
.
-
setAudioEncoder()
-
Set the sound encoding type, specify the default setting orMediaRecorder.AudioEncoder.AMR_NB
.
-
setVideoEncoder()
-
Set the video encoding type, specify the default setting orMediaRecorder.VideoEncoder.MPEG_4_SP
.
-
setOutputFile()
-
Set the output file, usegetOutputMediaFile(MEDIA_TYPE_VIDEO).toString()
from the example method in theSaving
Media Filessection.
-
setPreviewDisplay()
-
Specify theSurfaceView
preview
layout element for your application. Use the same object you specified forConnect Preview.
Caution:You must call theseMediaRecorder
configuration
methodsin this order, otherwise your application will encounter errors and the recording will fail.
-
Prepare MediaRecorder- Prepare the
MediaRecorder
with
provided configuration settings by callingMediaRecorder.prepare()
.
-
Start MediaRecorder- Start recording video by calling
MediaRecorder.start()
.
-
Stop Recording Video- Call the following methodsin order, to successfully complete a video recording:
-
Stop MediaRecorder- Stop recording video by calling
MediaRecorder.stop()
.
-
Reset MediaRecorder- Optionally, remove the configuration settings from the recorder by calling
MediaRecorder.reset()
.
-
Release MediaRecorder- Release the
MediaRecorder
by
callingMediaRecorder.release()
.
-
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.
-
Stop the Preview- When your activity has finished using the camera, stop the preview using
Camera.stopPreview()
.
-
Release Camera- Release the camera so that other applications can use it by calling
Camera.release()
.
Note:It is possible to useMediaRecorder
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, setsetRecordingHint(boolean)
totrue
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 theMediaRecorder
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:
- Create a new instance of
android.media.MediaRecorder
.
- Set the audio source using
MediaRecorder.setAudioSource()
.
You will probably want to useMediaRecorder.AudioSource.MIC
.
- Set output file format using
MediaRecorder.setOutputFormat()
.
- Set output file name using
MediaRecorder.setOutputFile()
.
- Set the audio encoder using
MediaRecorder.setAudioEncoder()
.
- Call
MediaRecorder.prepare()
on
the MediaRecorder instance.
- To start audio capture, call
MediaRecorder.start()
.
- To stop audio capture, call
MediaRecorder.stop()
.
- 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
==================================================================================================
分享到:
相关推荐
我的Android进阶之旅------>Android疯狂连连看游戏的实现 可以参考博客:http://blog.csdn.net/ouyang_peng/article/details/14115627
Android读写XML(上)——package说明.doc Android读写XML(下)——创建XML文档.doc ...Android基础教程之----动态更改屏幕方向的简单例子(LANDSCAPE与PORTRAIT)! .doc Android基础教程之----五大布局对象.doc
我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端 (地址:http://blog.csdn.net/ouyang_peng/article/details/47004617) 我的Android进阶之旅------>Android实现用...
深入理解jvm虚拟机+Android进阶之光-附件资源
我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能 http://blog.csdn.net/ouyang_peng/article/details/50813419 1、实现歌词同步滚动的功能,即歌曲播放到哪句...
为了满足您的要求,我将基于Android高级进阶这一主题,提供一些该领域的通用知识点,希望能够帮助到您。 Android高级进阶通常包括如下几个方面的深入学习: 1. Android系统架构:深入理解Android系统底层架构,...
Android 高手进阶教程(二)之----Android Launcher 抽屉类 SlidingDrawer 的 使用 最近在研究 Lanucher ,看了源码,发现了 SlidingDrawer 这个类,也就是 所谓的"抽屉"类。它的用法很简单,要包括 handle ,和 content...
Android知识体系图&面试&进阶(Version-1.0.1).xmind
《Android平台开发之旅(第2版)》涵盖Android 3/4的新特性,立足实际的开发案例,介绍了Android平台开发的基础概念、实用技术和应用模式。主要内容包括应用程序框架、高级界面、数据库应用、网络通信与Web开发、无线...
### Android高手进阶教程知识点详解 #### 一、Android常用命令集锦 ##### 1. 环境配置与管理 - **android**: 输入此命令会弹出SDK and AVD Manager界面,允许开发者进行SDK更新及AVD(Android Virtual Device)的...
我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现的源代码,原文地址:http://blog.csdn.net/ouyang_peng/article/details/10125409
android-support-v4-v7-v13-v14-v17(官方最新完整版),官方最新版的,压缩包内包含android-support-v4、android-support-v7-appcompat,android-support-v7-cardview,android-support-v7-gridlayout,android-support-...
我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现的源代码,原文地址:http://blog.csdn.net/ouyang_peng/article/details/10125409 这个进行了第二次优化
我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现的源代码,原文地址:http://blog.csdn.net/ouyang_peng/article/details/10125409 这个进行了优化
内容包含:android-support-v4_1.6.0_26_20120316.jar android-support-v4_1.6.0_26_20120623.jar android-support-v4_1.6.0_26_20120730.jar android-support-v4_1.6.0_26_20121109.jar android-support-v4_1.6.0_26...