分类:C#、Android、VS2015;

创建日期:2016-03-13

一、简介

利用Android提供的MediaRecorder类可直接录制音频。

1、权限要求

录制音频和视频需要下面的权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2、基本设计步骤

(1)初始化和录制

录制音频的基本设计步骤如下:

(1) 创建MediaRecorder对象。

(2) 调用SetAudioSource方法指定使用哪个硬件设备捕获音频输入(比如麦克风)。

(3) 调用SetOutputFormat方法指定录音输出文件的格式。

(4) 调用SetAudioEncoder方法设置音频编码类型。

(5) 调用SetOutputFile方法指定输出的音频文件。

(6) 调用Prepare方法初始化录音器。

(7) 调用Start方法开始录音。

下面的代码演示了如何实现:

protected MediaRecorder recorder;

void RecordAudio (String filePath)

{

try {

if (File.Exists (filePath)) {

File.Delete (filePath);

}

if (recorder == null) {

recorder = new MediaRecorder (); // Initial state.

} else {

recorder.Reset ();

recorder.SetAudioSource (AudioSource.Mic);

recorder.SetOutputFormat (OutputFormat.ThreeGpp);

recorder.SetAudioEncoder (AudioEncoder.AmrNb);

// Initialized state.

recorder.SetOutputFile (filePath);

// DataSourceConfigured state.

recorder.Prepare (); // Prepared state

recorder.Start (); // Recording state.

}

} catch (Exception ex) {

Console.Out.WriteLine( ex.StackTrace);

}

}

(2)停止录音

调用MediaRecorder 的Stop方法停止录音:

recorder.Stop();

(3)清除录音占用的资源

一旦停止了MediaRecorder,调用Reset方法将其置于空闲状态(idle state):

recorder.Reset();

当不再使用MediaRecorder实例时,必须释放其占用的资源:

recorder.Release();

二、示例

该例子的功能是录制来自麦克风的音频,如果笔记本带有麦克风,可直接通过模拟器来观察运行效果。录制以后,可直接单击播放按钮测试录制的效果。

这同样也是一个简单的示例,没有考虑录音过程中电话打入的情况,也没有考虑其他复杂的控制。

1、运行截图

2、设计步骤

(1)AndroidManifest.xml文件

在该文件中添加下面的权限(如果有了就不用添加了)。

<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

(2)添加ch2004Main.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/ch2004_btnRecStart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="开始录音" />
<Button
android:id="@+id/ch2004_btnRecStop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止录音" />
<Button
android:id="@+id/ch2004_btnPlayStart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="播放录音" />
<Button
android:id="@+id/ch2004_btnPlayStop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止播放录音" />
<TextView
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ch2004_textView1"
android:gravity="center_horizontal"
android:layout_marginTop="30dp" />
</LinearLayout>

(3)添加ch2004MainActivity.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Media; namespace MyDemos.SrcDemos
{
[Activity(Label = "ch2004MainActivity")]
[IntentFilter(new[] { Intent.ActionMain },
Categories = new[] { Intent.CategoryDefault, ch.MyDemosCategory })]
public class ch2004MainActivity : Activity
{
string filePath;
MediaRecorder recorder;
MediaPlayer player;
Button btnRecStart, btnRecStop, btnPlayStart, btnPlayStop;
TextView textView1; protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.ch2004Main);
//指定SD卡录制的音频文件路径
filePath = string.Format("{0}/{1}/myRecord.mp3",
Android.OS.Environment.ExternalStorageDirectory.Path,
Android.OS.Environment.DirectoryMusic);
textView1 = FindViewById<TextView>(Resource.Id.ch2004_textView1); btnRecStart = FindViewById<Button>(Resource.Id.ch2004_btnRecStart);
btnRecStart.Click += delegate
{
textView1.Text = "正在录音...";
try
{
StartRecorder();
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.StackTrace);
}
}; btnRecStop = FindViewById<Button>(Resource.Id.ch2004_btnRecStop);
btnRecStop.Click += delegate
{
StopRecorder();
textView1.Text = "录音已停止。";
}; btnPlayStart = FindViewById<Button>(Resource.Id.ch2004_btnPlayStart);
btnPlayStart.Click += delegate
{
textView1.Text = "正在播放录音...";
try
{
player = new MediaPlayer();
player.Reset();
player.SetDataSource(filePath);
player.Prepare();
player.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
};
btnPlayStop = FindViewById<Button>(Resource.Id.ch2004_btnPlayStop);
btnPlayStop.Click += delegate
{
player.Stop();
textView1.Text = "播放已停止。";
}; } private void StartRecorder()
{
try
{
if (System.IO.File.Exists(filePath))
{
System.IO.File.Delete(filePath);
}
if (recorder == null)
{
recorder = new MediaRecorder(); // Initial state.
}
else
{
recorder.Reset();
}
recorder.SetAudioSource(AudioSource.Mic); //录制来自麦克风的声音
recorder.SetOutputFormat(OutputFormat.Mpeg4);
recorder.SetAudioEncoder(AudioEncoder.AmrNb);
recorder.SetOutputFile(filePath);
recorder.Prepare();
recorder.Start();
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.StackTrace);
}
} private void StopRecorder()
{
if (recorder != null)
{
recorder.Stop();
recorder.Release();
recorder = null;
}
}
}
}

在模拟器中观察运行的效果,单击【录音】按钮开始录音,录音完毕后,直接单击【播放录音】就可以测试录制效果。

【Android】20.4 录音的更多相关文章

  1. 【Android】【录音】Android录音--AudioRecord、MediaRecorder

    [Android][录音]Android录音--AudioRecord.MediaRecorder Android提供了两个API用于实现录音功能:android.media.AudioRecord. ...

  2. Android 使用MediaRecorder录音

    package com.example.HyyRecord; import android.app.Activity; import android.content.Intent; import an ...

  3. Android开发教程 录音和播放

    首先要了解andriod开发中andriod多媒体框架包含了什么,它包含了获取和编码多种音频格式的支持,因此你几耍轻松把音频合并到你的应用中,若设备支持,使用MediaRecorder APIs便可以 ...

  4. Android 使用MediaRecorder录音调用stop()方法的时候报错【转】

    本文转载自:http://blog.csdn.net/u014737138/article/details/49738827 这个问题在网上看到了太多的答案,一直提示说按照官网的api的顺序来,其实解 ...

  5. android 20 Intnet类重要的成员变量

    Intnet类重要的成员变量: <intent-filter> <action android:name="android.intent.action.MAIN" ...

  6. [Exception Android 20] - Error:Execution failed for task ':app:processDebugResources'

    Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process.Pr ...

  7. Android 实现电话录音(窃听)

    配置文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=&qu ...

  8. android中通话录音

    file = new File(Environment.getExternalStorageDirectory(), this.incomeNumber + System.currentTimeMil ...

  9. Android录音应用

    首先是xml布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

随机推荐

  1. 数据库 之 E-R实体关系模型

    E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. 1.表示方法 E-R是描述现实世界概念结构模型的 ...

  2. 如何不使用pthread_cancel而杀死线程

    http://www.cnblogs.com/no7dw/archive/2012/09/27/2705847.html During the time I use standalone cross ...

  3. Tomcat之安装篇- 1

    1. 提供了下载页面 以及tomcat下载地址,点击即可下载 : Tomcat9.0(Windows64) 方便好用的录像机下载请点击: gif工具 即可下载. 2.下载好的压缩包进行解压 3.配置路 ...

  4. 解决m2e插件maven-dependency-plugin问题

    http://blog.csdn.net/smst1987/article/details/6871495 问题:maven-dependency-plugin (goals "copy-d ...

  5. div最小高度的2种写法

    1.第一种写法: 原理:在IE6中,使用CSS定义div的高度的时候经常遇到这个问题,就是当div的最小高度小于一定的值以后,就会发现,无论你怎么设置最小高度,div的高度会固定在一个值不再发生变动, ...

  6. 全栈JavaScript之路(十三)了解 ElementTraversal 规范

    支持Element Traversal 规范的浏览器有IE 9+.Firefox 3.5+.Safari 4+.Chrome 和Opera 10+. 对于元素间的空格,在IE9之前.都不会返回文档节点 ...

  7. (二)Linux Shell编程——运算符、注释

    2.7 Shell运算符 Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符.原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 ...

  8. mysql中内存的使用与分配

    mysql的内存分配,是调优的重中之重,所以必须搞清楚内存是怎么分配的 mysql> show global variables like '%buffer%'; +-------------- ...

  9. Erlang中atom的实现

    Erlang的原子(atom)在匹配中有着重要作用,它兼顾了可读性和运行效率. 通过atom,可以实现很多灵活高效的应用. atom可以看作是给字符串生成了一个ID,内部使用的是ID值,必要时可以取出 ...

  10. Swift3.0生成二维码、扫描二维码、相册读取二维码,兼容iOS7(结合ZXingObjC)

    二维码生成 //MARK: 传进去字符串,生成二维码图片(>=iOS7) text:要生成的二维码内容 WH:二维码高宽 private func creatQRCodeImage(text: ...