Tôi đang cố phát trực tuyến âm thanh từ micrô từ 1 Android này sang micrô khác qua WiFi. Sau khi xem xét một số ví dụ, tôi đã tạo 2 ứng dụng với một hoạt động đơn lẻ trong mỗi ứng dụng, 1 để chụp và gửi âm thanh và một ứng dụng khác để nhận.Phát trực tiếp giọng nói giữa Điện thoại Android qua WiFi
Tôi đã sử dụng các lớp Audiorecord và Audiotrack để chụp và phát. Tuy nhiên, tôi chỉ nghe thấy một số âm thanh tanh tách (hiện đã dừng sau khi tôi thực hiện một số thay đổi mặc dù tôi đã hoàn nguyên trở lại)
Hoạt động gửi giọng nói.
public class VoiceSenderActivity extends Activity {
private EditText target;
private TextView streamingLabel;
private Button startButton,stopButton;
public byte[] buffer;
public static DatagramSocket socket;
private int port=50005; //which port??
AudioRecord recorder;
//Audio Configuration.
private int sampleRate = 8000; //How much will be ideal?
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private boolean status = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
target = (EditText) findViewById (R.id.target_IP);
streamingLabel = (TextView) findViewById(R.id.streaming_label);
startButton = (Button) findViewById (R.id.start_button);
stopButton = (Button) findViewById (R.id.stop_button);
streamingLabel.setText("Press Start! to begin");
startButton.setOnClickListener (startListener);
stopButton.setOnClickListener (stopListener);
}
private final OnClickListener stopListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
status = false;
recorder.release();
Log.d("VS","Recorder released");
}
};
private final OnClickListener startListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
status = true;
startStreaming();
}
};
public void startStreaming() {
Thread streamThread = new Thread(new Runnable() {
@Override
public void run() {
try {
int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
DatagramSocket socket = new DatagramSocket();
Log.d("VS", "Socket Created");
byte[] buffer = new byte[minBufSize];
Log.d("VS","Buffer created of size " + minBufSize);
DatagramPacket packet;
final InetAddress destination = InetAddress.getByName(target.getText().toString());
Log.d("VS", "Address retrieved");
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize);
Log.d("VS", "Recorder initialized");
recorder.startRecording();
while(status == true) {
//reading data from MIC into buffer
minBufSize = recorder.read(buffer, 0, buffer.length);
//putting buffer in the packet
packet = new DatagramPacket (buffer,buffer.length,destination,port);
socket.send(packet);
}
} catch(UnknownHostException e) {
Log.e("VS", "UnknownHostException");
} catch (IOException e) {
Log.e("VS", "IOException");
}
}
});
streamThread.start();
}
}
Hoạt động để nhận giọng
public class VoiceReceiverActivity extends Activity {
private Button receiveButton,stopButton;
public static DatagramSocket socket;
private AudioTrack speaker;
//Audio Configuration.
private int sampleRate = 8000; //How much will be ideal?
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private boolean status = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
receiveButton = (Button) findViewById (R.id.receive_button);
stopButton = (Button) findViewById (R.id.stop_button);
findViewById(R.id.receive_label);
receiveButton.setOnClickListener(receiveListener);
stopButton.setOnClickListener(stopListener);
}
private final OnClickListener stopListener = new OnClickListener() {
@Override
public void onClick(View v) {
status = false;
speaker.release();
Log.d("VR","Speaker released");
}
};
private final OnClickListener receiveListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
status = true;
startReceiving();
}
};
public void startReceiving() {
Thread receiveThread = new Thread (new Runnable() {
@Override
public void run() {
try {
DatagramSocket socket = new DatagramSocket(50005);
Log.d("VR", "Socket Created");
byte[] buffer = new byte[256];
//minimum buffer size. need to be careful. might cause problems. try setting manually if any problems faced
int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
speaker = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,channelConfig,audioFormat,minBufSize,AudioTrack.MODE_STREAM);
speaker.play();
while(status == true) {
try {
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
socket.receive(packet);
Log.d("VR", "Packet Received");
//reading content from packet
buffer=packet.getData();
Log.d("VR", "Packet data read into buffer");
//sending data to the Audiotrack obj i.e. speaker
speaker.write(buffer, 0, minBufSize);
Log.d("VR", "Writing buffer content to speaker");
} catch(IOException e) {
Log.e("VR","IOException");
}
}
} catch (SocketException e) {
Log.e("VR", "SocketException");
}
}
});
receiveThread.start();
}
}
tôi đã sử dụng Wireshark để kiểm tra xem các gói tin đang được gửi đi và tôi có thể nhìn thấy các gói dữ liệu. Tuy nhiên, nguồn là địa chỉ MAC của thiết bị gửi và đích cũng giống như một địa chỉ vật lý. Không chắc chắn nếu điều này là có liên quan mặc dù.
Vậy vấn đề là gì?
Có ít nhất ba vấn đề bạn phải giải quyết: dữ liệu bị trễ (hoặc thiếu), thông lượng dữ liệu tổng thể và khả năng tần suất lấy mẫu hơi không khớp. Điện thoại IP thực tế phải có một phương tiện để đối phó với cả ba. Đồng hồ không phù hợp là đáng ngạc nhiên khó khăn - ban đầu bạn có thể giới thiệu một sự chậm trễ để cung cấp cho một số phụ cấp đệm, nhưng nếu người gửi chậm hơn bạn sẽ sử dụng bộ đệm và người nhận sẽ bị bỏ đói cho dữ liệu; trong khi nếu người gửi nhanh hơn thì bộ đệm cuối cùng sẽ tràn với dữ liệu chưa được phát. –
Tôi đã cố gắng thực hiện công việc này. Đã không thực sự có một vấn đề của tần số không phù hợp. Chậm trễ trong dữ liệu, vâng. Đã có một loại giao thức của riêng tôi để phù hợp với đồng hồ người nhận/người gửi. Cuối cùng nó đã làm việc nhưng chỉ với một số tụt hậu (tăng khoảng cách từ bộ định tuyến không dây) – Alabhya
Xin chào, tôi đã triển khai một ứng dụng thử nghiệm cho mã bạn có ở trên, thực hiện tất cả các thay đổi cần thiết được đề xuất bên dưới nhưng tôi vẫn gặp sự cố . Tôi đang nhận được comms giữa hai điện thoại không có vấn đề, nhưng tôi không nghĩ rằng mic được ghi đúng cách như tôi không nghe bất kỳ âm thanh ở đầu bên kia. Bạn có lẽ có một liên kết đến một giải pháp mẫu mà tôi có thể xem? – chuckliddell0