gpt4 book ai didi

java - 在android中将两个音频流混合成一个音频流?

转载 作者:搜寻专家 更新时间:2023-10-30 21:34:27 25 4
gpt4 key购买 nike

我正在尝试混合两个音频流以获得单个输出流,这在 Android 中是否可行?在我的例子中,我有一个来自麦克风的输入流,即我正在使用 AudioRecord 录制用户的语音。我想将这段录音与一个简短的声音剪辑混合,然后创建一个新的流,它是两个流的混合,然后通过数据报套接字发送它。我进行了很多研究,以下是我了解到的内容。

首先,SoundPool 可以帮助我实现我的目标,但我认为我不能提供麦克风作为输入源。

目前我正在将来自 MIC 的录音保存在缓冲区中,然后通过数据报套接字将其流式传输。我想我可以将声音剪辑保存在另一个缓冲区中,然后添加两个缓冲区(我知道这是一个愚蠢的想法,因为我必须管理各种声音属性)。

也可能我可以将麦克风的录音保存到一个文件,并将声音剪辑的录音保存到另一个文件并混合它们,但是我认为我不能这样做,因为我正在尝试通过数据报套接字流式传输录音.

我认为使用 Java 的声音 API 可以实现我正在努力实现的目标。但是安卓不支持。

总而言之,作为我的最终目标,我正在努力实现的是在基于 VoIP (SIP) 的通话中注入(inject)音效(声音效果像蟋蟀的声音伴随着我的声音)。

我希望我对我的问题给出了清楚的解释。

问题 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();

最佳答案

编辑 - 2018 年 8 月 31 日

源代码 fork 于 https://github.com/aksappy/jsresources-examples

我想这一定对你有帮助,

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

关于java - 在android中将两个音频流混合成一个音频流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25129620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com