如何解决OpenAL / Webassembly:如何使用捕获的音频数据
我正在开发一个原型,其中我通过 socket.io
将声音数据从 OpenAL(前端使用 webassembly)发送到后端,然后将数据写入文件。它工作正常,除了在我将所有原始数据写入文件(例如 test.raw)并尝试将其转换为 wav 格式后,我只会收到噪音。我尝试了 ffmpeg
和 sox
都没有任何运气:
- 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 举报,一经查实,本站将立刻删除。