如何从 TarsosDSP AudioDispatcher 获取 PCM 16 位数据?
How to get PCM 16-bit data from TarsosDSP AudioDispatcher?
我想从 TarsosDSP AudioDispatcher 获取 PCM 16 位数据。我按照这个 进行实时音频流的音高分析。我得到了想要的结果,但我还想从 AudioDispatcher 获取 PCM 数据。
AudioDispatcher adp = AudioDispatcherFactory.fromDefaultMicrophone(2048, 0);
如何从 AudioDispatcher 或任何其他技术获取所需的 PCM 数据以将我的数据从 android AudioRecord 传递到 AudioDispatcher?
您只需创建自己的 AudioDispatcherFactory.java class 即可将 audioRecorder 对象传递给 AudioDispatcherFactory AudioRecorder
的参数
像这样:
package com.example.revertback;
public class AudioDispatcherFactory {
public static AudioDispatcher fromDefaultMicrophone(final AudioRecord audioInputStream,final int sampleRate,
final int audioBufferSize, final int bufferOverlap) {
int minAudioBufferSize = AudioRecord.getMinBufferSize(sampleRate,
android.media.AudioFormat.CHANNEL_IN_MONO,
android.media.AudioFormat.ENCODING_PCM_16BIT);
int minAudioBufferSizeInSamples = minAudioBufferSize/2;
if(minAudioBufferSizeInSamples <= audioBufferSize ){
TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(sampleRate, 16,1, true, false);
TarsosDSPAudioInputStream audioStream = new AndroidAudioInputStream(audioInputStream, format);
//start recording ! Opens the stream.
return new AudioDispatcher(audioStream,audioBufferSize,bufferOverlap);
}else{
throw new IllegalArgumentException("Buffer size too small should be at least " + (minAudioBufferSize *2));
}
}
public static AudioDispatcher fromPipe(final String source,final int targetSampleRate, final int audioBufferSize,final int bufferOverlap){
PipedAudioStream f = new PipedAudioStream(source);
TarsosDSPAudioInputStream audioStream = f.getMonoStream(targetSampleRate,0);
return new AudioDispatcher(audioStream, audioBufferSize, bufferOverlap);
}
}
然后在你的Activity中做一些这样的事情
AudioRecorder recorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION,
RECORDER_SAMPLERATE, RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING, bufferSize);
recorder.startRecording();
AudioDispatcher dispatcher = com.example.revertback.AudioDispatcherFactory.fromDefaultMicrophone(recorder,22050,1024,0);
PitchDetectionHandler pdh = new PitchDetectionHandler() {
@Override
public void handlePitch(PitchDetectionResult result, AudioEvent e) {
final float pitchInHz = result.getPitch();
}
};
AudioProcessor p = new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN, 22050, 1024, pdh);
dispatcher.addAudioProcessor(p);
new Thread(dispatcher,"Audio Dispatcher").start();
我想从 TarsosDSP AudioDispatcher 获取 PCM 16 位数据。我按照这个
AudioDispatcher adp = AudioDispatcherFactory.fromDefaultMicrophone(2048, 0);
如何从 AudioDispatcher 或任何其他技术获取所需的 PCM 数据以将我的数据从 android AudioRecord 传递到 AudioDispatcher?
您只需创建自己的 AudioDispatcherFactory.java class 即可将 audioRecorder 对象传递给 AudioDispatcherFactory AudioRecorder
的参数像这样:
package com.example.revertback;
public class AudioDispatcherFactory {
public static AudioDispatcher fromDefaultMicrophone(final AudioRecord audioInputStream,final int sampleRate,
final int audioBufferSize, final int bufferOverlap) {
int minAudioBufferSize = AudioRecord.getMinBufferSize(sampleRate,
android.media.AudioFormat.CHANNEL_IN_MONO,
android.media.AudioFormat.ENCODING_PCM_16BIT);
int minAudioBufferSizeInSamples = minAudioBufferSize/2;
if(minAudioBufferSizeInSamples <= audioBufferSize ){
TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(sampleRate, 16,1, true, false);
TarsosDSPAudioInputStream audioStream = new AndroidAudioInputStream(audioInputStream, format);
//start recording ! Opens the stream.
return new AudioDispatcher(audioStream,audioBufferSize,bufferOverlap);
}else{
throw new IllegalArgumentException("Buffer size too small should be at least " + (minAudioBufferSize *2));
}
}
public static AudioDispatcher fromPipe(final String source,final int targetSampleRate, final int audioBufferSize,final int bufferOverlap){
PipedAudioStream f = new PipedAudioStream(source);
TarsosDSPAudioInputStream audioStream = f.getMonoStream(targetSampleRate,0);
return new AudioDispatcher(audioStream, audioBufferSize, bufferOverlap);
}
}
然后在你的Activity中做一些这样的事情
AudioRecorder recorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION,
RECORDER_SAMPLERATE, RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING, bufferSize);
recorder.startRecording();
AudioDispatcher dispatcher = com.example.revertback.AudioDispatcherFactory.fromDefaultMicrophone(recorder,22050,1024,0);
PitchDetectionHandler pdh = new PitchDetectionHandler() {
@Override
public void handlePitch(PitchDetectionResult result, AudioEvent e) {
final float pitchInHz = result.getPitch();
}
};
AudioProcessor p = new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN, 22050, 1024, pdh);
dispatcher.addAudioProcessor(p);
new Thread(dispatcher,"Audio Dispatcher").start();