微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenAL / Webassembly:如何使用捕获的音频数据

如何解决OpenAL / Webassembly:如何使用捕获的音频数据

我正在开发一个原型,其中我通过 socket.io 将声音数据从 OpenAL(前端使用 webassembly)发送到后端,然后将数据写入文件。它工作正常,除了在我将所有原始数据写入文件(例如 test.raw)并尝试将其转换为 wav 格式后,我只会收到噪音。我尝试了 ffmpegsox 都没有任何运气:

  • sox -r 44100 -e 有符号整数 -b 16 -c 1 test.raw out_sox.wav
  • ffmpeg -f s16le -ar 44100 -ac 1 -c:a pcm_s16le -i test.raw out.wav -y

这是用于声音捕获的程序:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <emscripten.h>
#include <AL/al.h>
#include <AL/alc.h>

#define BUFFER_SIZE 64


int cnt=0;

void mycallback(void *arg)
{
    ALCint nframes;
    ALCdevice *dev = (ALCdevice*)arg;

    alcGetIntegerv(dev,ALC_CAPTURE_SAMPLES,1,&nframes);

    char buffer[BUFFER_SIZE];

    if(nframes>0)
    {
        alcCaptureSamples(dev,buffer,nframes);

        cnt++;

        char *command = (char *)malloc(2000);

        command = strcpy(command,"socket.emit('record',[");
      
         for (int i = 0; i < sizeof(buffer); i++) {

            char currentValue[30];
            sprintf(currentValue,"%d",buffer[i]);

            command = strcat(command,currentValue);

            if (i != sizeof(buffer) - 1) {
                command = strcat(command,",");
            }
        }

        command = strcat(command,"])");

        emscripten_run_script(command);

        free(command); 
    }

    if (cnt > 1000) {
        emscripten_cancel_main_loop();
        fprintf(stdout," -#################### Done! \n");
        emscripten_run_script("socket.close()");
    }
}

EMSCRIPTEN_KEEPALIVE
int record() {
    
    ALCdevice *dev = NULL;

    emscripten_run_script("console.log('recording ')");

    dev = alcCaptureOpenDevice(alcGetString(NULL,ALC_CAPTURE_DEVICE_SPECIFIER),44100,AL_FORMAT_MONO16,BUFFER_SIZE);
    ALCcontext *context = alcCreateContext(dev,NULL);

    alcCaptureStart(dev);

    emscripten_set_main_loop_arg(mycallback,dev,-1,1);

    return 0;
}

int main(int argc,char *argv[])
{
    emscripten_run_script("console.log('start recording ====== ')");
    record();
}

这是来自后端的片段:

//imports,etc..

server,err := socketio.NewServer(nil)

    if err != nil {
        log.Fatal(err.Error())
    }

    f,err := os.OpenFile("test.raw",os.O_CREATE,0600)

    if err != nil {
        log.Fatal(err.Error())
    }

    server.OnEvent("/","record",func(s socketio.Conn,data []rune) string {

        fmt.Printf(" recording test,received %d \n",len(data))

        err = binary.Write(f,binary.BigEndian,[]byte(string(data)))

        if err != nil {
            fmt.Println(err.Error())
        }

        return "ok"
    })


//run server,...etc

我想知道我是否缺少某些设置,或者只是做错了事情。我使用 AL_FORMAT_MONO16 作为数据格式。我还将数据作为 int 数组发送,然后在将其写入文件之前转换为字节,任何帮助将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。