【发布时间】:2016-05-11 05:29:45
【问题描述】:
我有一个使用 libwebsockets 的 C 服务器,我想将接收到的音频流保存在磁盘上的文件中。
这是我的代码 sn-p:
#define FILENAME "/home/ubuntu/Desktop/file.wav"
FILE *received_file;
struct lws_context *Audiocontext;
static int callback_audio(
struct lws *wsi,
enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_ESTABLISHED:
{
printf("client is connected\n");
received_file = fopen(FILENAME, "w+");
if (received_file == NULL)
{
printf("Failed to open file\n");
exit(EXIT_FAILURE);
}
}
break;
case LWS_CALLBACK_RECEIVE: {
if(strcmp((char*)in,"EOS")==0)
{
printf("End of stream!\n");
fclose(received_file);
}
else
{
fwrite(in, 1, len, received_file);
}
}
}
}
我收到消息“客户端已连接”以及文件,但内容不正确,我无法播放。我认为使用fwrite() 将流保存在文件中的方式存在问题。
客户端正在发送编码为 wav、16Khz、单声道的音频块。这是来自客户端的 sn-p(它是一个 javascript 客户端,完整代码在这里:http://kaljurand.github.io/dictate.js/)。
if (recorder) {
recorder.stop();
config.onEvent(MSG_STOP, 'Stopped recording');
// Push the remaining audio to the server
recorder.export16kMono(function(blob) {
socketSend(blob);
socketSend(TAG_END_OF_SENTENCE);
recorder.clear();
}, 'export16kMono');
config.onEndOfSpeech();
} else {
config.onError(ERR_AUDIO, "Recorder undefined");
}
客户端运行良好,我将它用于完全相同的任务,但使用的是 Java 服务器。如果有人能告诉我如何将这些音频块保存在有效文件中,我将不胜感激。
【问题讨论】:
-
你能比较一下你尝试发送的文件和写在磁盘上的文件吗?我假设你在 linux 上运行这个程序?
-
我从麦克风发送实时音频。客户端具有将块编码为 raw 或 wav 的功能。我在 Ubuntu 上。
-
您能否检查您的 wav 文件是否以
RIFF之类的开头,为此您可以键入:hexdump -C your_file.wav | head -
这是我得到的:00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
标签: c audio libwebsockets