【发布时间】:2014-04-30 16:02:54
【问题描述】:
我目前正在玩一个小程序,以了解更多关于 udp 数据报传输的信息。 我的脚本基于我在此处找到的示例,而我正在做的只是使用带有两个线程的 AudioTrack 和 AudioRecorder。一个从远程设备接收数据包并使用AudioTrack播放,另一个将AudioRecorder录制的数据包发送到远程设备。
经过一些测试,整个 ing 似乎运行良好,声音从 A 传输到 B 和从 B 传输到 A 没有问题。请注意我使用的两个设备是两个三星 Galaxy s4 mini(实际上它可以与任何三星设备)。然后我在华硕的变压器平板电脑和 Acer Iconia 500 之间使用它,效果很好,但噪音很小。
现在我试图让它与 Sony Xperia E 和三星 Galaxy 一起工作(肯定可以),但那里的大问题是:当声音从 xperia 传到 Galaxy 时,我听到了声音,但什么都没有另一方面,xperia 的扬声器似乎无法播放这些数据包(我在日志中看到它们已被传输)。我希望这可能是设置问题,但不确定,当我与华为设备(任何类型)通信时也会发生同样的行为。
如果您想查看我的配置和所有内容,这是我的 UDP 流式传输脚本:
public void startStreaming() {
Thread streamThread = new Thread(new Runnable() {
int bytesRcv;
@Override
public void run() {
int minAudioBufSize = AudioRecord.getMinBufferSize(8000,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
byte[] datagramBuffer = new byte[512];
DatagramPacket packet;
InetAddress destination;
try {
destination = InetAddress.getByName(REMOTE_ADDRESS);
} catch (UnknownHostException e1) {
Log.e("Streaming", "Unknown host: " + e1.getLocalizedMessage());
destination = null;
}
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
minAudioBufSize);
Log.d("Streaming", "Recorder initialized");
recorder.startRecording();
while (running == true) {
try{
// reading data from MIC into buffer
bytesRcv = recorder.read(datagramBuffer, 0,
datagramBuffer.length);
// putting buffer in the packet
packet = new DatagramPacket(datagramBuffer, bytesRcv,
destination, SERVER_PORT);
Log.d("Streaming", "Packet size: " + packet.getLength());
Log.d("Streaming", "Packet content: " + Arrays.toString(datagramBuffer));
socket.send(packet);
} catch (IOException e) {
Log.e("Streaming",
"Could not send package: "
+ e.getLocalizedMessage());
running = false;
}catch (IllegalArgumentException iae){
Log.e("Streaming", "Error in audio datagram" + iae.getMessage());
running = false;
}
}
}
});
streamThread.start();
这是我接收数据包的脚本:
public void startReceive() {
Thread receiveThread = new Thread(new Runnable() {
@Override
public void run() {
int audioBufSize = AudioTrack.getMinBufferSize(8000,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
byte[] datagramBuffer = new byte[512];
speaker = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
audioBufSize, AudioTrack.MODE_STREAM);
speaker.play();
while (running == true) {
try {
DatagramPacket packet = new DatagramPacket(
datagramBuffer, datagramBuffer.length);
socket.receive(packet);
Log.d("Receiver", "Received " + packet.getLength() + " bytes");
// sending data to the Audiotrack obj i.e. speaker
speaker.write(datagramBuffer, 0, packet.getLength());
Log.d("Receiver", "Writing buffer content: " + Arrays.toString(datagramBuffer));
} catch (IOException e) {
Log.e("Receiver",
"Could not send package: "
+ e.getLocalizedMessage());
running = false;
}catch (IllegalArgumentException iae){
Log.e("Receiver", "Error in audio datagram" + iae.getMessage());
running = false;
}
}
}
});
receiveThread.start();
}
有人已经遇到过这种问题吗?任何建议都会很棒。
谢谢
【问题讨论】:
标签: android audio-streaming audiorecord android-audiorecord audiotrack