c - 使用 C libwebsockets 将音频流保存在文件中

标签 c audio libwebsockets

我有一个使用 libwebsockets 的 C 服务器,我想将接收到的音频流保存在磁盘上的文件中。

这是我的代码片段:

#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、单声道的音频 block 。这是客户端的一个片段(它是一个 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 服务器。如果有人能告诉我如何将这些音频 block 保存在有效文件中,我将不胜感激。

最佳答案

我认为你没有在你的 wav 文件中写标题。为此,

  • 您可以编写一些函数来执行此操作,请参阅specification here
  • 或者您可以使用专用库,例如​​ libsndfile ,使用起来并不复杂:

    // instead of fopen, write something like
    SF_INFO info;
    SNDFILE * sf;
    
    info.samplerate = sample_rate;
    info.channels = 1;
    info.sections = 1;
    info.seekable = 0;
    info.frames = 0;
    info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
    
    sf = sf_open(filename, SFM_WRITE, &info);
    

    // instead of fwrite, something like
    sf_write_short(sf, in, len / sizeof(short));
    

    // and instead of fclose
    sf_close(sf);
    

关于c - 使用 C libwebsockets 将音频流保存在文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37153774/

相关文章:

c - libwebsockets 客户端连接失败

c++ - 如何防止 libwebsockets 客户端超时

c - 如何在不使用回调函数的情况下使用 libwebsockets 将数据从 C 程序发送到 websocket?

c++ - 检测单元测试中的特定函数调用

java - 如何使用相同的逻辑替换两个文件中出现的相同 'stem' 数字?

c# - 使用 PlayOneShot 时如何停止音频

jquery - 如何在 ASP.NET MVC 4 中自动将录制的音频文件保存到服务器上

javascript - 将 javascript 插入 echo PHP

c - 如何修复GDB找不到文件: "../sysdeps/unix/sysv/linux/raise.c:50"

c - 动态索引循环