zoukankan      html  css  js  c++  java
  • 7.5 使用AudioTrack播放原始音频

        AudioTrack是Android中的一个类,它允许播放原始音频样本。利用该类能够播放使用AudioRecord捕获的音频,而他们并不能使用mediaPlayer对象来播放。

        为了构造一个AudioTrack对象,需要传入一系列的配置变量来描述待播放的音频。

        第一个参数是流类型。可能的值定义为AudioManager类中的常量。在示例中将使用AudioManager.STREAM_MUSIC,这是用于正常播放音乐的音频流。

        第二个参数是将要播放的音频数据的采样率,以赫兹为单位。在示例中,采用11025Hz的采样率来捕获音频,因此咋播放时需要指定相同的值。

        第三个参数是通道配置。可能的值与构造AudioRecord对象时使用的值相同,他们定义为AudioFormat类中的常量。他们的名称解释了其作用。

        AudioFormat.CHANNEL_CONFIGURATION_MONO   单通道

        AudioFormat.CHANNEL_CONFIGURATION_STEREO 双通道

        AudioFormat.CHANNEL_CONFIGURATION_INVALID 错误的音频通道掩码

        AudioFormat.CHANNEL_CONFIGURATION_DEFAULT 默认通道

        第四个参数是音频格式,可能的值与构造AudioRecord对象时使用的值相同,他们定义为AudioFormat类中的常量。使用的值应匹配待传入的音频的值。

        AudioFormat.ENCODING_DEFAULT

        AudioFormat.ENCODING_INVALID

        AudioFormat.ENCODING_PCM_16BIT

        AudioFormat.ENCODING_PCM_8BIT

        第五个参数是将对象中用于存储音频的缓冲区大小。为了确定使用最小的缓冲区大小,可以调用getMinBufferSize方法,同时传入采样率、通道配置和音频格式。

    1     private int frequency=11025;
    2     private int channelConfiguration=AudioFormat.CHANNEL_CONFIGURATION_MONO;
    3     private int audioEncoding=AudioFormat.ENCODING_PCM_16BIT;

    4 private int bufferSize=AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding)

        最后一个参数是模式。可能的值定义为AudioTrack类中的常量。

        AudioTrack.MODE_STATIC:在播放发生之前将所有的音频数据转移到AudioTrack对象。

        AudioTrack.MODE_STREAM:在播放的同时将音频数据持续的转移到AudioTrack对象。

        下面是AudioTrack配置:

    1                 AudioTrack audioRtack=new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, bufferSize, AudioTrack.MODE_STREAM);

        一旦构造了AudioTrack,就需要打开音频源,将音频数据读取到缓存中,并将它传递给AudioTrack对象。

        根据一个包含了正确格式(11025Hz、16位、单声道)的原始PCM数据的文件,可以构造DataInputStream。

    1                 DataInputStream dis=new DataInputStream(new FileInputStream(recordingFile));

        然后可以调用AudioTrack对象上的play方法,并开始从DataInputStream写入音频。

     1                 audioRtack.play();
     2                 try {
     3                     while(isPlaying&&dis.available()>0){
     4                         int i=0;
     5                         while(dis.available()>0&&i<audiodata.length){
     6                             audiodata[i]=dis.readShort();
     7                             i++;
     8                         }
     9                         audioRtack.write(audiodata, 0, audiodata.length);
    10                     }
    11                 } catch (IOException e) {
    12                     e.printStackTrace();
    13                 }
    14                 try {
    15                     dis.close();
    16                 } catch (IOException e) {
    17                     e.printStackTrace();
    18                 }

         以上内容涵盖了使用AudioTrack播放由AudioRecord录制的音频文件的基本知识。

  • 相关阅读:
    Qt调用外部程序QProcess通信
    QT错误:collect2:ld returned 1 exit status
    ARM编译空间属性(转)
    深入C语言内存区域分配(进程的各个段)详解(转)
    Linux系统的组成和内核的组成
    C语言中,头文件和源文件的关系(转)
    Ubuntu安装samba服务器
    2018年应该做的事
    生活经历1
    学习笔记
  • 原文地址:https://www.cnblogs.com/ZSS-Android/p/3949411.html
Copyright © 2011-2022 走看看