使用AudioTrack从Android上的套接字传输音频

使用AudioTrack从Android上的套接字传输音频,android,sockets,streaming,Android,Sockets,Streaming,我正在尝试使用AudioTrack类播放PCM流。代码如下: AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 20000, AudioTrack.MODE_STREAM); audioTrack.play(); // Reading data. byte[] data = ne

我正在尝试使用AudioTrack类播放PCM流。代码如下:

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 20000, AudioTrack.MODE_STREAM);
audioTrack.play();
// Reading data.
byte[] data = new byte[200];
int n = 0;
try {
   while ((n = s.getInputStream().read(data)) != -1)
      audioTrack.write(data, 0, n);
}
catch (IOException e) {
   return;
}
不幸的是,我得到的音频连续中断。我试着把数据写在一个文件里,而不是写在音轨上,然后用aplay播放。看起来很完美。不要打扰。使用audioTrack时,我报告的代码是否有任何错误?或者仅仅是数据没有及时到达?
谢谢

您可以做一些检查:

  • 使用代码读取文件。只需以流的形式打开文件

  • 测量吞吐量。每次数据块到达时,记录时间(
    System.nanoTime()
    )和长度。然后,您可以计算数据是否延迟到达


  • 您可以进行一些检查:

  • 使用代码读取文件。只需以流的形式打开文件

  • 测量吞吐量。每次数据块到达时,记录时间(
    System.nanoTime()
    )和长度。然后,您可以计算数据是否延迟到达


  • 我以前没有使用过
    AudioTrack
    ,但将您的版本与我看到的主要区别比较,您创建的
    AudioTrack
    的缓冲区大小与您自己使用的缓冲区大小不同:
    20000
    vs
    200
    。我会尝试对两者使用相同的大小。

    我以前没有使用过
    AudioTrack
    ,但将您的版本与我看到的主要区别比较,您创建的
    AudioTrack
    的缓冲区大小与您自己使用的缓冲区大小不同:
    20000
    vs
    200
    。我会尝试对两者使用相同的大小。

    从可变延迟流读取音频数据并将其发送到audioTrack.write(在同一线程中写入)会像您所观察到的那样效果不佳。这是一个用于两个线程的作业,其中一个线程从流中读取数据(并缓冲合理数量),而另一个线程将音频数据写入audioTrack对象。您可以一次读取和写入大块音频数据,但audioTrack类对此进行了限制。当audioTrack线程在写入操作后唤醒时,您无法在该线程中执行重要工作,否则将导致音频输出出现间隙;您必须为其提供连续的数据流。

    从可变延迟流读取音频数据并将其发送到audioTrack.write(在同一线程中写入)将无法正常工作,正如您所观察到的那样。这是一个用于两个线程的作业,其中一个线程从流中读取数据(并缓冲合理数量),而另一个线程将音频数据写入audioTrack对象。您可以一次读取和写入大块音频数据,但audioTrack类对此进行了限制。当audioTrack线程在写入操作后唤醒时,您无法在该线程中执行重要工作,否则将导致音频输出出现间隙;您必须为其提供连续的数据流。

    尝试将代码以高优先级放在单独的线程中

    android.os.Process.setThreadPriority(android.os.Process.THREAD\u PRIORITY\u emergency\u音频)
    


    在线程的run()中读取和写入数据。

    尝试将代码以高优先级放在单独的线程中

    android.os.Process.setThreadPriority(android.os.Process.THREAD\u PRIORITY\u emergency\u音频)
    


    在线程的run()中读取和写入数据。

    我尝试了流式传输文件,效果非常好。没有打扰。但是,通过计算吞吐量,我应该得出什么结论呢?谢谢你的帮助。我不知道你是从哪里获得数据的,但似乎AudioTrack消耗数据的速度比你接收数据的速度快。我尝试了流式传输文件,效果非常好。没有打扰。但是,通过计算吞吐量,我应该得出什么结论呢?谢谢你的帮助。我不知道你是从哪里获得数据的,但似乎AudioTrack比你接收数据的速度更快。我已经用一些不同的值尝试过了。我总是被打断。我已经用不同的价值观尝试过了。所以,如果我理解正确的话:一个线程从套接字读取数据,然后将数据放在某个地方,可能在共享队列中?或者你建议采用什么其他结构?同时,另一个线程将数据从该缓冲区迭代到audioTrack。这是你的建议吗?谢谢在我的实现中,我只是从单词数组和头/尾指针创建了自己的FIFO。重要的是当audioTrack.write准备接受音频数据时,准备好音频数据。因此,如果我理解正确:一个线程从套接字读取数据,并将数据放在某个地方,可能在共享队列中?或者你建议采用什么其他结构?同时,另一个线程将数据从该缓冲区迭代到audioTrack。这是你的建议吗?谢谢在我的实现中,我只是从单词数组和头/尾指针创建了自己的FIFO。重要的是,当audioTrack.write准备接受音频数据时,请准备好音频数据。