Смешивание двух аудиопотоков в один аудиопоток в android?

Я пытаюсь смешивать два аудиопотока, чтобы получить один выходной поток, возможно ли это в android? В моем случае у меня есть один входной поток, поступающий с микрофона, т. Е. Я записываю речь пользователей с помощью AudioRecord. Я хочу смешать эту запись с коротким звуковым клипом, а затем создать новый поток, представляющий собой смесь потока, а затем отправить его через сокет Datagram. Я много исследовал, и вот что я узнал.

Во-первых, SoundPool может помочь мне достичь моей цели, но я думаю, что не могу предоставить микрофон в качестве источника входного сигнала.

В настоящее время я сохраняю запись из MIC в буфере, а затем передаю ее по сокету датаграммы. Я думал, что могу сохранить звуковой клип в другом буфере, а затем добавить и буфер (который, как я знаю, является немой идеей, так как есть различные свойства звука, которые мне придется управлять).

Также может быть, я могу сохранить запись с микрофона в файл и запись звукового клипа в другой файл и смешать их, однако я думаю, что не могу этого сделать, поскольку я пытаюсь передать запись через сокет Datagram.

Я думаю, что то, что я пытаюсь достичь, возможно с использованием Java 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(); в  @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(); 

Я думаю, это должно быть полезно для вас,

http://www.jsresources.org/examples/AudioConcat.html

Ссылка представляет собой пример с открытым исходным кодом для того, как конкатенировать / смешивать аудиофайлы. Я думаю, что источник, который вас больше всего интересует, будет

MixingAudioInputStream.java

http://www.jsresources.org/examples/MixingAudioInputStream.java.html

Я не знаю о поддержке Java Sound API, но AFAIK Java Sound API предназначен для базового захвата и воспроизведения звука. Вам все равно придется делать свой собственный способ смешивания, не так ли?

ATB