将两个音频流混合成一个音频流



我试图混合两个音频流,以获得一个单一的输出流是可能的android?在我的例子中,我有一个来自麦克风的输入流,也就是说,我正在使用AudioRecord记录用户的语音。我想把这个录音和一个简短的声音片段混合在一起,然后创建一个新的流,它是两个流的混合,然后通过数据报套接字发送。我做了很多研究,以下是我所了解到的。

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

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

也可能是我可以保存录音从麦克风到一个文件和录音的声音剪辑到一个不同的文件和混合它们,但我认为我不能这样做,因为我试图流记录在数据报套接字。

我想我要实现的可能是使用Java的声音API。但安卓不支持。

总而言之,我试图实现的最终目标是在基于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();

EDIT - Aug 31 2018

源代码在https://github.com/aksappy/jsresources-examples分叉

我想这对你一定有帮助,

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

这个链接是一个关于如何连接/混合音频文件的开源示例。我想你最感兴趣的来源应该是

MixingAudioInputStream.java

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

我不知道Java声音API的支持,但AFAIK Java声音API是用于基本的音频捕获和播放。你还是要用你自己的方法混合,是吗?

作为

最新更新