zoukankan      html  css  js  c++  java
  • 【Android】20.4 录音

    分类: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、运行截图

    image

    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;
                }
            }
        }
    }

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

  • 相关阅读:
    在非controller中获取HttpServletRequest (如在service中获取)
    office 转 html html 转 office
    firewalld的操作
    centos7 安装jdk,mysql,nginx,redis,zookeeper,activemq
    nginx
    学习网站
    Centos7安装搜狗输入法
    “星期几”不同脚本写法
    正则表达式 exec 获取字符串中的汉字
    js和jquery获取父级元素、子级元素、兄弟元素的方法
  • 原文地址:https://www.cnblogs.com/rainmj/p/5271168.html
Copyright © 2011-2022 走看看