【问题标题】:Simple android audio sequencer implementation简单的android音频音序器实现
【发布时间】:2021-03-28 14:11:32
【问题描述】:

我想为 Android 创建一个简单的音频音序器应用程序(如 FL、GarageBand 等)。但是,我一直在处理音频。特别是,我应该如何实现音频播放(即播放录制的音频),是否有任何库可以使用或者最好只使用默认的 Java 方法?最近我发现了双簧管,但我不确定它是否适合这个目的。

我使用原始文件作为音频源(如钢琴音符)并使用 AudioTrack 访问它们。

【问题讨论】:

    标签: java android audio synthesizer


    【解决方案1】:

    如果用于音频输出的 android 环境类似于 Java,那么获得准确计时的最佳方法是计算 PCM 帧并使用它来保持所有元素对齐。我在 Android 上做的不多,但我认为用于输出的类是 AudioTrack,因为它允许您流式传输 PCM。我会考虑确保您所有的声音都可以转换为 PCM,并使用该数据形式进行混音和效果处理,然后通过AudioTrack 输出。

    我没看过双簧管。也许它已经构建了所需的一切。我是老派——最近才学会寻找图书馆而不是重新发明轮子。

    这是一个previous question,它谈到了输出 PCM。

    【讨论】:

      【解决方案2】:

      在 Android 上,对于原生音频应用,我建议使用双簧管。 打开单个输出流,然后将所有音轨混合到单个流中。正如其他 Phil 所建议的那样,使用帧数作为时间参考。

      您可以使用 DrumThumper 应用作为起点,因为它将多个 WAV 样本混合到一个输出中。

      【讨论】:

      • 那我去看看,谢谢!
      【解决方案3】:

      你也可以看看我正在开发的这个库:https://github.com/WaveBeans/wavebeans

      它允许您混合不同的示例文件,但您需要自己完成播放部分作为自定义输出。它在 Kotlin 上,目前不确定它是否能与 Java 无缝协作。

      代码如下所示(用于预定义的混合):

      val silence = input { ZeroSample }
      val sample1 = wav("file://sample1.wav")
      val sample2 = wav("file://sample1.wav")
      
      val track1 = sample1..silence.trim(100, MILLISECONDS)..sample1
      val track2 = sample2..silence.trim(10, MILLISECONDS)..sample2..silence.trim(10, MILLISECONDS)..sample2
      
      val mix = track1 + track2
      
      mix.out { 
      /**
       * here is the output code to perform the playback
       * follow https://wavebeans.io/docs/api/outputs/output-as-a-function.html
       */
      }
      
      // and evaluate the output as by https://wavebeans.io/docs/exe/
      

      【讨论】:

        猜你喜欢
        • 2022-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 2014-03-13
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多