【问题标题】:How to read raw values of 3gp / AMR-NB audio format?如何读取 3gp / AMR-NB 音频格式的原始值?
【发布时间】:2013-01-10 21:36:04
【问题描述】:

在我的 Android 应用程序中,我正在录制用户的声音,并将其保存为 .3gp 编码的音频文件。

我想要做的是打开它,即表示音频样本的序列 x[n],以便执行一些音频信号分析。

有人知道我该怎么做吗?

【问题讨论】:

    标签: java android audio


    【解决方案1】:

    您可以使用 Android MediaCodec 类来解码 3gp 或其他媒体文件。解码器输出是标准的 PCM 字节数组。您可以直接将此输出发送到 Android AudioTrack 类进行播放或继续使用此输出字节数组进行进一步处理,例如 DSP。要应用 DSP 算法,必须将字节数组转换为浮点/双精度数组。有几个步骤可以获得字节数组输出。总结如下:

    1. 实例化媒体编解码器

      String mMime = "audio/3gpp"
      MediaCodec  mMediaCodec = MediaCodec.createDecoderByType(mMime);
      
    2. 创建媒体格式并配置媒体编解码器

      MediaFormat mMediaFormat = new MediaFormat();
      mMediaFormat = MediaFormat.createAudioFormat(mMime,
          mMediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE),
          mMediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
      
      mMediaCodec.configure(mMediaFormat, null, null, 0);
      mMediaCodec.start();
      
    3. 从 MediaCodec 捕获输出(应该在线程内处理)

      MediaCodec.BufferInfo buf_info = new MediaCodec.BufferInfo();
      int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(buf_info, 0);
      byte[] pcm = new byte[buf_info.size];
      mOutputBuffers[outputBufferIndex].get(pcm, 0, buf_info.size);
      

    此Google IO talk 可能与此处相关。

    【讨论】:

    • 非常感谢您让我开始。我将在本周晚些时候测试并实现其中的一些代码,并可能会接受您的回答。
    • 您能告诉我如何添加将播放 3gp 文件的整个 inputStream 的 AudioTrack 吗?
    • 一旦从 MediaCodec 将数据读入字节数组,就可以使用 AudioTrack 类的 write 方法播放。请在此处查看写方法签名,developer.android.com/reference/android/media/AudioTrack.html
    • @shamimz 我们如何将文件作为输入传递给这个 MediaCodec?我目前只有一个指向 3gp 文件的 filePath。
    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2013-04-26
    相关资源
    最近更新 更多