我正在使用令人惊叹的 Superpowered 库 (SuperpoweredAndroidAudioIO) 进行低延迟音频录制。虽然基本概念对我来说很清楚,但我想将录制的音频(到达缓冲区)传回 Java 中的 InputStream(不录制到文件),然后我可以从中读取录制的音频并进行处理。
我想这个问题也可以更普遍地问 - 如何从 C++ 中定期更新的缓冲区中提供 Java 中的 InputStream?
我正在使用令人惊叹的 Superpowered 库 (SuperpoweredAndroidAudioIO) 进行低延迟音频录制。虽然基本概念对我来说很清楚,但我想将录制的音频(到达缓冲区)传回 Java 中的 InputStream(不录制到文件),然后我可以从中读取录制的音频并进行处理。
我想这个问题也可以更普遍地问 - 如何从 C++ 中定期更新的缓冲区中提供 Java 中的 InputStream?
好吧,我在评论中收到的建议原来是一个简单且有效的解决方案: 在 C++ 中创建管道:
if (pipe(pipefd) == -1) {
__android_log_print(ANDROID_LOG_VERBOSE, "C++", "Error creating pipe");
}
...
将文件描述符传递给 Java:
...
return pipefd[0];
...
然后在 Java/Android 中:
private ParcelFileDescriptor.AutoCloseInputStream underlyingStream;
ParcelFileDescriptor pfd = ParcelFileDescriptor.adoptFd(getFD());
underlyingStream = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
对我来说效果很好,但当然我仍然很高兴收到其他建议。