我想在Android中混合使用两个音频流来获得单个输出流吗?在我的例子中,我有一个来自Microphone的输入流,即我正在使用AudioRecord录制用户语音。我想将这个录音与一个短的声音片段混合,然后创建一个新的流,它是两个流的混合,然后通过数据报套接字发送。 我研究了很多,这就是我所知道的。
首先,SoundPool可以帮助我实现目标,但我认为我无法提供麦克风作为输入源。
目前我正在将记录从MIC保存在缓冲区中,然后通过数据报套接字进行流式传输。我以为我可以将声音片段保存在另一个缓冲区中,然后添加两个缓冲区(我知道这是一个愚蠢的想法,因为我必须管理各种声音属性)。
也可能是我可以将录音从麦克风保存到文件并将声音片段录制到不同的文件并将它们混合,但我想我不能这样做,因为我试图通过数据报套接字流式传输录音
我认为使用Java的声音API可以实现我想要实现的目标。但Android不支持它。
总结一下,我想要实现的目标是在基于VoIP(SIP)的呼叫中注入声音效果(声音效果就像蟋蟀声音和我的声音一样)。
我希望我对我的问题作出明确的解释。
问题1:我怎样才能做到这一点? 问题2:我可以使用Java的Sound API创建JAR文件并在我的项目中使用它吗? (关于这一点,我认为这是不可能的)
以下是我的录音和音频播放的一些代码。
这是我的录音代码:
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();
答案 0 :(得分:2)
编辑 - 2018年8月31日
源代码分叉于https://github.com/aksappy/jsresources-examples
我认为这对你有帮助,
该链接是如何连接/混合音频文件的开源示例。我认为你最感兴趣的来源是
MixingAudioInputStream.java
http://www.jsresources.org/examples/MixingAudioInputStream.java.html
我不知道Java Sound API的支持,但AFAIK Java Sound API用于基本的音频捕获和回放。你还是要按照自己的方式混音,不管你呢?
ATB