Android音频流-在AudioTrack上获取静态噪音

Android音频流-在AudioTrack上获取静态噪音,android,streaming,pcm,audiotrack,Android,Streaming,Pcm,Audiotrack,我有一个在本地主机上运行的流式服务器。当我尝试从Android应用程序中传输音频时。我大部分时间都会听到静电噪音(你在收音机里听到的那种)。有时整个音频是静态噪声,有时是部分噪声,有时音频播放得很好,所以我不确定出了什么问题 以下是我的android应用程序中的流式代码: 新线程( 新的Runnable(){ @凌驾 公开募捐{ 试一试{ URI=URI.create(“http://192.168.1.6:5000/api/tts"); HttpURLConnection urlConnect

我有一个在本地主机上运行的流式服务器。当我尝试从Android应用程序中传输音频时。我大部分时间都会听到静电噪音(你在收音机里听到的那种)。有时整个音频是静态噪声,有时是部分噪声,有时音频播放得很好,所以我不确定出了什么问题

以下是我的android应用程序中的流式代码:

新线程(
新的Runnable(){
@凌驾
公开募捐{
试一试{
URI=URI.create(“http://192.168.1.6:5000/api/tts");
HttpURLConnection urlConnection=(HttpURLConnection)uri.toURL().openConnection();
urlConnection.setRequestMethod(“POST”);
setRequestProperty(“内容类型”、“应用程序/json”);
urlConnection.setRequestProperty(“x-access-token”,credentials.getAccessToken());
urlConnection.setRequestProperty(“接受”、“*”);
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.connect();
OutputStreamWriter osw=新的OutputStreamWriter(urlConnection.getOutputStream());
字符串体=“{\'text\”:\”+text+“\”,\“ttsLang\”:\”+language+“\”};
Log.d(“TTS_HTTP”,正文);
写(体);
osw.flush();
osw.close();
Log.d(“TTS_OUT”,credentials.getAccessToken());
Log.d(“TTS_OUT”,urlConnection.getResponseCode()+“”+urlConnection.getResponseMessage());
//定义音频曲目的缓冲区大小
内部抽样率=16000;
int bufferSize=AudioTrack.getMinBufferSize(采样率、AudioFormat.CHANNEL\u输出单声道、,
音频格式。编码(PCM(16位);
if(bufferSize==AudioTrack.ERROR | | bufferSize==AudioTrack.ERROR_BAD_值){
bufferSize=采样率*2;
}
缓冲区大小*=2;
AudioTrack=新的AudioTrack(
AudioManager.STREAM_音乐,
抽样率,
AudioFormat.CHANNEL\u OUT\u MONO,
AudioFormat.ENCODING_PCM_16位,
缓冲区大小*2,
音频跟踪模式(音频流);
字节[]缓冲区=新字节[bufferSize];
InputStream is=urlConnection.getInputStream();
整数计数;
音轨播放();
而((count=is.read(buffer,0,bufferSize))>-1){
Log.d(“TTS_计数”,计数+”);
audioTrack.write(缓冲区,0,计数);
}
is.close();
audioTrack.stop();
audioTrack.release();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
).start();
请帮我修改代码来解决这个问题。我不能像我以前描述的那样正确地听到声音

此外,服务器响应很好,因为我可以使用Python代码将其保存到文件中。保存的文件正在正常播放

导入请求 >>>输入波 >>>以wave.open(“output.wav”、“wb”)作为f: ... f、 设置帧速率(16000)#16khz ... f、 设置通道(1)#单通道 ... f、 设置采样宽度(2)#16位音频 ... res=requests.post(“http://192.168.1.6:5000/api/tts,headers={“x-access-token”:token},json={“text”:“你好,要不要来点茶”,“ttsLang”:“en-us”},stream=True) ... 对于i-in-res.iter\u内容(块大小=16*1024): ... f、 书面记录(一) ...
更新:将输入流写入文件,然后从文件播放到音轨效果很好…

最后,我解决了这个问题。原来,
AudioTrack
不喜欢写入的数据量不一致,因此会产生静态噪声。这是以前写入
音轨的字节计数序列,导致问题
1248
3439
5152
5152
3834
<代码>823(不一致)。因此,我仔细研究了
DataInputStream
方法,并使用了它,解决了静态噪声问题。字节计数序列现在看起来像是
5152
5152
5152
,…,
5152
(一致)。但是现在的问题是读取由于
EOFEException
而被跳过的剩余字节。所以我必须实现我自己的方法来解决这个问题

公共类TTSInputStream扩展了DataInputStream{
公共TTSInputStream(输入流输入){
超级(in),;
}
public final int readFullyUntilEof(字节b[])引发IOException{
返回readFullyUntilEof(b,0,b.length);
}
公共final int readFullyUntilEof(字节b[],int off,int len)引发IOException{
if(len<0)
抛出新的IndexOutOfBoundsException();
int n=0;
while(n