我正在尝试在android上通过套接字进行音频流传输。 我使用AudioRecord在客户端获取录制的音频,使用AudioTrack类在服务器端播放原始数据。但我无法做到。 还有其他程序吗?
音频服务器文件
public void run()
{
BufferedOutputStream bufferedStreamInstance = null;
try
{
Socket socket = new Socket("192.168.1.25", 1234);
bufferedStreamInstance = new BufferedOutputStream(
socket.getOutputStream());
} catch (FileNotFoundException e)
{
throw new IllegalStateException("Cannot Open File", e);
} catch (UnknownHostException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
DataOutputStream dataOutputStreamInstance = new DataOutputStream(
bufferedStreamInstance);
int bufferRead = 0;
int bufferSize = AudioRecord
.getMinBufferSize(this.getFrequency(), this.getChannelConfiguration(), this.getAudioEncoding());
AudioRecord recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, this.getFrequency(), this
.getChannelConfiguration(), this.getAudioEncoding(), bufferSize);
short[] tempBuffer = new short[bufferSize];
recordInstance.startRecording();
while (this.isRecording)
{
bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION)
{
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_INVALID_OPERATION");
}
else if (bufferRead == AudioRecord.ERROR_BAD_VALUE)
{
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_BAD_VALUE");
}
else if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION)
{
throw new IllegalStateException(
"read() returned AudioRecord.ERROR_INVALID_OPERATION");
}
try
{
for (int idxBuffer = 0; idxBuffer < bufferRead; ++idxBuffer)
{
dataOutputStreamInstance.writeShort(tempBuffer[idxBuffer]);
}
} catch (IOException e)
{
throw new IllegalStateException(
"dataOutputStreamInstance.writeShort(curVal)");
}
}
recordInstance.stop();
try
{
dataOutputStreamInstance.close();
bufferedStreamInstance.close();
} catch (IOException e)
{
throw new IllegalStateException("Cannot close buffered writer.");
}
}
audioreceiver
public void run()
{
musicLength = 66535;
music = new short[musicLength];
try
{
ServerSocket serverSocket = new ServerSocket(1234);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
dis = new DataInputStream(bis);
while (dis.available() > 0)
{
music[musicLength - 1 - i] = dis.readShort();
i++;
}
try
{
dis.close();
} catch (IOException e)
{
e.printStackTrace();
}
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, musicLength,
AudioTrack.MODE_STREAM);
audioTrack.play();
audioTrack.write(music, 0, musicLength);
} catch (Throwable t)
{
Log.e("AudioTrack", "Playback Failed");
}
}
答案 0 :(得分:2)
您无法发送数据吗?或者无法在接收器端正确播放?与MediaRecorder类一样,AudioRecorder类可能会为标题留出一些空间,然后在完成录制后执行搜索以填充标题。因为无法在套接字上进行查找,所以标头会写入文件的头部。我认为你最好的做法是将文件写入SD卡,然后使用hexeditor将字节与工作音频文件进行比较。然后,您应该能够确定标头的格式,并且当它被接收时,您可以寻找文件的开头(或缓冲区的开头)并将标头写在正确的位置。