Я пытаюсь смешивать два аудиопотока, чтобы получить один выходной поток, возможно ли это в android? В моем случае у меня есть один входной поток, поступающий с микрофона, т.е. Я записываю речь пользователей с помощью AudioRecord. Я хочу смешать эту запись с коротким звуковым клипом, а затем создать новый поток, представляющий собой смесь потока, а затем отправить его через сокет Datagram. Я много исследовал, и вот что я узнал.
Во-первых, SoundPool может помочь мне достичь моей цели, но я думаю, что не могу предоставить микрофон в качестве источника входного сигнала.
В настоящее время я сохраняю запись из MIC в буфере, а затем передаю ее по сокету датаграммы. Я думал, что могу сохранить звуковой клип в другом буфере, а затем добавить и буфер (который, как я знаю, является немой идеей, так как есть различные свойства звука, которые мне придется управлять).
Также я могу сохранить запись с микрофона в файл и записать звуковой клип в другой файл и смешать их, однако я думаю, что не могу этого сделать, поскольку я пытаюсь передать запись по сокету Datagram.
Я думаю, что то, что я пытаюсь достичь, возможно с использованием Java sound API. Но Android не поддерживается.
Подводя итог, цель, которую я пытаюсь достичь в качестве моей конечной цели, - внедрить звуковой эффект в VoIP (SIP), основанный на звонке (звуковой эффект, такой как крикет, звучит вместе с моим голосом).
Надеюсь, я дал четкое объяснение моей проблемы.
Вопрос 1: Как я могу это достичь? Вопрос 2: Могу ли я создать JAR файл с использованием Java Sound API и использовать его в своем проекте? (об этом, я думаю, это невозможно)
Вот несколько кодов моей аудиозаписи и воспроизведения звука.
Это мой код для записи звука:
public void run() {
// TODO Auto-generated method stub
try{
int minbuffer = AudioRecord.getMinBufferSize(sample, config, format);
DatagramSocket socket = new DatagramSocket();
Log.d(TAG, "Socket Created");
socket.setBroadcast(true);
byte[] ubuff = new byte[minbuffer];
DatagramPacket packet;
Log.d(TAG, "Packet Created");
InetAddress dest = InetAddress.getByName("10.10.1.126");
//InetAddress dest = InetAddress.
//InetSocketAddress dest= new InetSocketAddress(host, port);
Log.d(TAG, "Address"+dest);
rec = new AudioRecord(MediaRecorder.AudioSource.MIC,sample,
config,format,minbuffer);
rec.startRecording();
while(status == true){
minbuffer = rec.read(ubuff, 0,ubuff.length);
Log.d(TAG, "Reading While");
packet = new DatagramPacket(ubuff, ubuff.length,dest,port);
socket.send(packet);
}
}catch(Exception e){
Log.d(TAG, "Bad Datagram");
}
}
});
stream.start();
Это мой код для воспроизведения звука:
@Override
public void run() {
// TODO Auto-generated method stub
try{
android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
AudioManager mm = (AudioManager)getSystemService(AUDIO_SERVICE);
DatagramSocket rSocket = new DatagramSocket(8080);
Log.d(TAG, "Recive Socket");
int m_buf = AudioRecord.getMinBufferSize(sample, config, format);
byte[] _buff = new byte[m_buf];
AudioTrack rSpeaker = new AudioTrack(mm.STREAM_MUSIC,sample,config,
format,m_buf,AudioTrack.MODE_STREAM);
mm.setSpeakerphoneOn(false);
mm.setStreamVolume(AudioManager.STREAM_MUSIC, 100, AudioManager.MODE_IN_COMMUNICATION);
Log.d(TAG, "zzRecorder");
rSpeaker.setPlaybackRate(sample);
rSpeaker.play();
while(true){
try{
DatagramPacket rPacket = new DatagramPacket(_buff, _buff.length);
rSocket.receive(rPacket);
_buff = rPacket.getData();
rSpeaker.write(_buff, 0, m_buf);
Log.d(TAG, "Yo Start Write");
}catch(Exception e){
}
}
}catch(Exception e){
}
}
});
rvStrm.start();