当前位置: 首页 > 面试题库 >

Android:混合多个AudioTrack实例?

郑浩博
2023-03-14
问题内容

我需要同时运行两个AudioTrack实例。它们必须单独运行,因为我以不同的可变采样率播放它们。我发现,如果我在同一线程中运行它们,它们将“轮流”运行。我在各自的线程中运行它们,但是音频断断续续。

关于使两个实例更好玩的任何想法?如果没有,那么即使我想以不同的采样率播放两个短缓冲区,也有一些技巧将它们混合在一起。


问题答案:

我有4个音轨同时播放,它们似乎播放得很好。在HTC Desire 1.1ghz
OC上进行测试。我有时会在穿线时遇到小故障。有时,如果所有四个都在播放,则在我尝试加入该线程时不会停止。需要做更多的测试。这是我的课程,用于播放在给定路径下记录的WAV文件

    package com.ron.audio.functions;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

public class AudioPlayManager implements Runnable {

private File fileName;
private volatile boolean playing;

public AudioPlayManager() {
    super();
    setPlaying(false);
}

public void run(){
      // Get the length of the audio stored in the file (16 bit so 2 bytes per short)
      // and create a short array to store the recorded audio.
      int musicLength = (int)(fileName.length()/2);
      short[] music = new short[musicLength];

      try {
        // Create a DataInputStream to read the audio data back from the saved file.
        InputStream is = new FileInputStream(fileName);
        BufferedInputStream bis = new BufferedInputStream(is);
        DataInputStream dis = new DataInputStream(bis);

        // Read the file into the music array.
        int i = 0;
        while (dis.available() > 0) {
          music[i] = dis.readShort();
          i++;
        }

        // Close the input streams.
        dis.close();

        // Create a new AudioTrack object using the same parameters as the AudioRecord
        // object used to create the file.
        AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
                                                11025, 
                                               AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                               AudioFormat.ENCODING_PCM_16BIT, 
                                               musicLength, 
                                               AudioTrack.MODE_STREAM);
        // Start playback
        audioTrack.play();

        // Write the music buffer to the AudioTrack object
        while(playing){
            audioTrack.write(music, 0, musicLength);
        }

      }
      catch(Exception e){
          e.printStackTrace();
      }

}


public void setFileName(File fileName) {
    this.fileName = fileName;
}

public File getFileName() {
    return fileName;
}

public void setPlaying(boolean playing) {
    this.playing = playing;
}

public boolean isPlaying() {
    return playing;
}

}



 类似资料:
  • 我在资源文件夹中有两个PCM声音文件。我使用inputstream并将其转换为bytearray。 然后,我对它们进行了归一化处理,将music1和music2相加,并将其输出到字节数组输出中。最后,将输出阵列放入音频轨道。 很明显,我什么都没听到,有些地方出了问题。

  • 问题内容: 好的,我有一个频率发生器,它使用AudioTrack将PCM数据发送到硬件。这是我正在使用的代码: 频率与滑动条相关,并且在样品生成循环中报告了正确的值。当我启动应用程序时,一切都很好。当您沿着滑动条拖动手指时,您会听到清晰的声音。但是经过大约10秒钟的播放之后,音频开始变得跳动。它不是平滑的扫描,而是交错的,并且仅在大约每1000 Hz左右更改音调。关于什么可能导致此的任何想法? 如

  • Android/H5混合试验过程 在创建和编辑试验时,建议使用Chrome浏览器,以达到最佳体验。 在这部分中,我们将以优化页面上的一个标题的文案,预期提升转化为例,来说明如何使用编程模式试验。先通过一张简单的流程图了解所需的步骤,再一步步进行具体操作: 1 试验方案 一个完整的A/B 测试需要根据目前已有的用户数据进行分析判断,推断并建立假设,才能针对性的做出改变和调整,根据具体需求,构建产品A

  • OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。这也是混合这一名字的出处,我们混合(Blend)(不同物体的)多

  • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引文来回答。 我想知道混合和本地移动开发之间的区别。我在Android系统方面只有相当的经验,所以在这两种情况下,我都会学到一些新东西。 我的项目只是一个仅由4个页面组成的移动应用程序,只是从网站上获取一些文章而已。 在这种情况下,混合开发会更好还是只坚持原生?! 性能方面哪个更好? phonegap/cordova学习曲线呢? 如果我要混

  • 执行测试脚本后,我看到控制台“驱动程序null”错误 剧本: 如果我错过了什么,有人能帮忙吗。谢谢,