Android:使用 AudioTrack 和 Socket 手动有效地流式传输音频

Posted

技术标签:

【中文标题】Android:使用 AudioTrack 和 Socket 手动有效地流式传输音频【英文标题】:Android : manually streaming audio effeciently using AudioTrack and Socket 【发布时间】:2013-07-17 14:49:34 【问题描述】:

基本想法是创建一个应用程序,该应用程序可以从一个设备录制音频,并使用套接字通过 Wlan 将其发送到另一台将播放它的设备。简而言之,一个局域网语音聊天程序。

我正在使用 AudioRecord 对象从麦克风录制实时音频,然后将录制的数据读入字节数组,然后将字节数组写入 TCP 套接字。然后接收设备从套接字中读取该字节数组并将其写入 AudioTrack 对象的缓冲区。

好像

录音-->字节数组-->socket--->LAN--->socket-->字节数组-->AudioTrack

使用 while 循环重复该过程。

虽然音频在那里播放,但它在帧之间存在滞后。即当我说你好时,接收者听到 He-ll--O。虽然音频是完整的,但缓冲块之间存在延迟。

据我所知,延迟是由于局域网传输延迟

如何改进它? 我应该使用什么方法才能像在 Skype 和 gtalk 等商业在线聊天应用程序中一样流畅?

【问题讨论】:

【参考方案1】:

听起来您需要一个更长的缓冲区来处理局域网上音频传输的差异。为了解决这个问题,您可以在套接字字节数组和音轨之间创建一个中间缓冲区。您的缓冲区可以是 AudioTrack 对象中使用的缓冲区大小的 x 倍。所以是这样的:

套接字字节 -> 音频缓冲区 -> 用于输入音频轨道的缓冲区 -> 音频轨道

当音频开始录制时,不要播放任何内容,直到它完全填满较长的缓冲区。之后,您可以将音频轨道缓冲区大小的块提供给您的音频轨道对象。

【讨论】:

但缓冲区不会开始减少,因为音频将以比到达速度更大的速度输入 缓冲区会随着缓冲区出现较晚而减少。但也应该在迟到的人最终到达时补上。需要考虑的一件事是将缓冲区提交到网络的时间与录制音频的采样率保持一致。要考虑的另一件事是,您可能会使缓冲区乱序。因此,您在将音频播放到接收器之前的延迟应该足够大,以便有时间处理。

以上是关于Android:使用 AudioTrack 和 Socket 手动有效地流式传输音频的主要内容,如果未能解决你的问题,请参考以下文章

调节 Android AudioTrack 播放速度

Android使用AudioTrack播放WAV音频文件

Android音视频使用opensles和audiotrack进行播放pcm

Android音视频使用opensles和audiotrack进行播放pcm

Android使用AudioTrack发送红外信号

Android音视频之AudioTrack播放音频