当前位置: 首页 > 知识库问答 >
问题:

将录制的音频保存到文件- OpenSL ES - Android

毛勇
2023-03-14

我正在尝试从麦克风录制,添加一些效果,并将其保存到文件中

我已经从AndroidNDK中包含的本地音频示例开始。我设法添加了一些混响并播放它,但我没有找到任何关于如何完成此操作的示例或帮助。

任何帮助都是受欢迎的。

共有2个答案

漆雕誉
2023-03-14

将原始矢量从c传递到java,并使用mediaRecorder将其编码为mp3,我不知道您是否可以从原始矢量设置音频源,但可能。。。

齐文林
2023-03-14

OpenSL不是一个文件格式和访问的框架。如果您想要一个原始的PCM文件,只需打开它进行写入,并将来自OpenSL回调的所有缓冲区放入该文件。但是如果你想要编码的音频,你需要你自己的编解码器和格式处理器。可以使用ffmpeg库,或者内置stagefright。

将写入播放缓冲区更新到本地原始PCM文件

我们从本机音频 jni.c 开始

#include <stdio.h>
FILE* rawFile = NULL;
int bClosing = 0;

...

void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context)
{
    assert(bq == bqPlayerBufferQueue);
    assert(NULL == context);
    // for streaming playback, replace this test by logic to find and fill the next buffer
    if (--nextCount > 0 && NULL != nextBuffer && 0 != nextSize) {
        SLresult result;
        // enqueue another buffer
        result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);
        // the most likely other result is SL_RESULT_BUFFER_INSUFFICIENT,
        // which for this code example would indicate a programming error
        assert(SL_RESULT_SUCCESS == result);
        (void)result;

        // AlexC: here we write:
        if (rawFile) {
            fwrite(nextBuffer, nextSize, 1, rawFile);
        }
    }
    if (bClosing) { // it is important to do this in a callback, to be on the correct thread
        fclose(rawFile);
        rawFile = NULL;
    }
    // AlexC: end of changes
}

...

void Java_com_example_nativeaudio_NativeAudio_startRecording(JNIEnv* env, jclass clazz)
{
    bClosing = 0;
    rawFile = fopen("/sdcard/rawFile.pcm", "wb");

...

void Java_com_example_nativeaudio_NativeAudio_shutdown(JNIEnv* env, jclass clazz)
{
    bClosing = 1;

...

 类似资料:
  • 问题内容: 我最终想要做的是从用户的麦克风中进行录音,并在完成后将文件上传到服务器。到目前为止,我已经设法使用以下代码将数据流传递到元素: 如何从那开始,到录制到文件? 问题答案: 它允许您在浏览器中录制音频,然后为您提供导出和下载录制内容的选项。 您可以查看该页面的源代码以找到指向javascript的链接,但总而言之,有一个对象包含一个方法和一个方法。

  • 对不起我的英语不好:( 我开始我的android应用程序项目,这个应用程序录制麦克风,如果我点击开始录制按钮,应用程序获取麦克风并将其写入文件,当我点击停止时,一个文件保存到SD卡中。 项目代码: 输出文件 开始录音 停止录制 播放声音录制文件 我想录下声音并将其放入变量ByteArray中,在不将音频文件保存到SD卡的情况下播放 我有一个像我想要的项目,但它是用actionscript 3编写的

  • 问题内容: 在过去的几天里,尝试使其正常工作时遇到了麻烦。但是我想要的是我们有一个可以通过网络发送原始数据的应用程序。然后,我读入此二进制数据并将其保存到wav(任何音频)文件中。稍后可以查看压缩。 所以有问题的代码: 也尝试过使用上述声明,但是我得到了例外:。因此,我认为正在发生的事情是因为我的流是原始音频数据,并且没有wave报头,所以抛出异常? 该文件确实可以成功写入,但是它都是静态的,是否

  • 我一直在寻找保存音频到SdCard。 我还试图保存以下内容: 在这两种情况下,它都起作用,但会保存到内部存储中。从不使用SD卡 我使用getExternalFilesDirs()来创建。但如果用户卸载应用程序,则会丢失文件。 我不想那样。 如何将音频保存在SD卡公用文件夹中或创建新文件夹。 任何时候它都会创建到内部存储中。 有什么解决办法吗??? 我尝试了这个,我可以在SD卡中创建一个文档。还有一

  • 我想保存/录制Google识别服务用于语音转文本操作的音频(使用识别意图或语音识别器)。 我经历了很多想法: > 使用了媒体录制器:不工作。这破坏了语音识别。mic只允许一次操作 在执行语音到文本API复制临时音频文件之前,尝试查找识别服务在何处保存该文件,但未成功 我几乎绝望了,但我只是注意到Google Keep应用程序正在做我需要做的事情!我使用logcat调试了一点keep应用程序,该应用