Android 超强SDK同步录制回放
Android Superpowered SDK Record and Playback simultaneously
我的目标是播放本地文件,同时以低延迟录制设备的麦克风输入。
我来到 Superpowered 库,因为从文档中它提供了低延迟功能。
我使用 SuperpoweredAdvancedAudioPlayer 和 SuperpoweredAndroidAudioIO 创建了播放器,播放效果很好。
SuperpoweredAndroidAudioIO 具有带参数 boolean enableInput、boolean enableOutput 的构造函数。目前我正在使用 enableInput == false 和 enableOutput == true。当我将这些参数设置为 true - 没有效果。
请问是否可以同时录制文件和播放其他文件?
库中也有 SuperpoweredRecorder class,但它说不能直接写入磁盘。并且需要用到createWAV、fwrite、closeWAV方法。
我试过单独实现 Recorder,但质量不好(它比真实录音快两到三倍 + 声音失真)。
这是我使用的最简单的记录代码:
void SuperpoweredFileRecorder::start(const char *destinationPath) {
file = createWAV(destinationPath, sampleRate, 2);
audioIO = new SuperpoweredAndroidAudioIO(sampleRate, bufferSize, true, false, audioProcessing, NULL, bufferSize); // Start audio input/output.
}
void SuperpoweredFileRecorder::stop() {
closeWAV(file);
audioIO->stop();
}
static bool audioProcessing(void *clientdata, short int *audioInputOutput, int numberOfSamples, int samplerate) {
fwrite(audioInputOutput, sizeof(short int), numberOfSamples, file);
return false;
}
我可能无法为此目的使用 Superpowered,需要直接使用 OpenSL ES 进行录制。
提前致谢!
对我来说,当我将 numberOfSamples 加倍时,这会起作用
fwrite(audioInputOutput, sizeof(short int), numberOfSamples * 2, file);
这将导致清晰的立体声输出
经过实验我找到了解决方案。
- SuperpoweredRecorder 可以很好地录制曲目;
- 我创建了分离 SuperpoweredAndroidAudioIO 源 - 一个用于播放,另一个用于录音机。经过一些同步操作后,它运行良好(我将延迟降至非常低的水平,因此它适合我的需要)。
我 post 一些代码片段与我实现的想法:
https://bitbucket.org/snippets/kasurd/Mynnp/nativesuperpoweredrecorder-with
希望对大家有所帮助!
您可以使用一个将 enableInput 和 enableOutput 设置为 true 的 SuperpoweredAndroidAudioIO 实例来执行此操作。
音频处理回调(在您的情况下为 audioProcessing())在 audioInputOutput 参数中接收音频(麦克风)。只需将其传递给您的 SuperpoweredRecorder,它就会将其写入磁盘。
之后,进行您的SuperpoweredAdvancedAudioPlayer处理,并将结果转换为audioInputOutput。那将转到音频输出。
所以在伪代码中就像:
audioProcessing(audioInputOutput) {
recorder->process(audioInputOutput)
player->process(some_buffer)
float_to_short_int(some_buffer, audioInputOutput)
}
切勿在音频处理回调中执行任何 fwrite,因为它必须在很短的时间内完成,并且磁盘操作可能太慢。
我的目标是播放本地文件,同时以低延迟录制设备的麦克风输入。 我来到 Superpowered 库,因为从文档中它提供了低延迟功能。 我使用 SuperpoweredAdvancedAudioPlayer 和 SuperpoweredAndroidAudioIO 创建了播放器,播放效果很好。
SuperpoweredAndroidAudioIO 具有带参数 boolean enableInput、boolean enableOutput 的构造函数。目前我正在使用 enableInput == false 和 enableOutput == true。当我将这些参数设置为 true - 没有效果。
请问是否可以同时录制文件和播放其他文件?
库中也有 SuperpoweredRecorder class,但它说不能直接写入磁盘。并且需要用到createWAV、fwrite、closeWAV方法。 我试过单独实现 Recorder,但质量不好(它比真实录音快两到三倍 + 声音失真)。 这是我使用的最简单的记录代码:
void SuperpoweredFileRecorder::start(const char *destinationPath) {
file = createWAV(destinationPath, sampleRate, 2);
audioIO = new SuperpoweredAndroidAudioIO(sampleRate, bufferSize, true, false, audioProcessing, NULL, bufferSize); // Start audio input/output.
}
void SuperpoweredFileRecorder::stop() {
closeWAV(file);
audioIO->stop();
}
static bool audioProcessing(void *clientdata, short int *audioInputOutput, int numberOfSamples, int samplerate) {
fwrite(audioInputOutput, sizeof(short int), numberOfSamples, file);
return false;
}
我可能无法为此目的使用 Superpowered,需要直接使用 OpenSL ES 进行录制。
提前致谢!
对我来说,当我将 numberOfSamples 加倍时,这会起作用
fwrite(audioInputOutput, sizeof(short int), numberOfSamples * 2, file);
这将导致清晰的立体声输出
经过实验我找到了解决方案。
- SuperpoweredRecorder 可以很好地录制曲目;
- 我创建了分离 SuperpoweredAndroidAudioIO 源 - 一个用于播放,另一个用于录音机。经过一些同步操作后,它运行良好(我将延迟降至非常低的水平,因此它适合我的需要)。
我 post 一些代码片段与我实现的想法:
https://bitbucket.org/snippets/kasurd/Mynnp/nativesuperpoweredrecorder-with
希望对大家有所帮助!
您可以使用一个将 enableInput 和 enableOutput 设置为 true 的 SuperpoweredAndroidAudioIO 实例来执行此操作。
音频处理回调(在您的情况下为 audioProcessing())在 audioInputOutput 参数中接收音频(麦克风)。只需将其传递给您的 SuperpoweredRecorder,它就会将其写入磁盘。
之后,进行您的SuperpoweredAdvancedAudioPlayer处理,并将结果转换为audioInputOutput。那将转到音频输出。
所以在伪代码中就像:
audioProcessing(audioInputOutput) {
recorder->process(audioInputOutput)
player->process(some_buffer)
float_to_short_int(some_buffer, audioInputOutput)
}
切勿在音频处理回调中执行任何 fwrite,因为它必须在很短的时间内完成,并且磁盘操作可能太慢。