2016-05-11 3 views
1

У меня есть сервер C, который использует libwebsockets, и я хочу сохранить полученный аудиопоток в файле на диске.Сохранить аудиопоток в файле с помощью C libwebsockets

Вот мой фрагмент кода:

#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, mono. Вот фрагмент от клиента (это клиент 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. Я был бы признателен, если бы кто-нибудь мог указать мне, как сохранить эти звуковые фрагменты в действительном файле.

+0

Не можете сравнить файл, который вы пытаетесь отправить, с файлом, записанным на диск? Я предполагаю, что вы запускаете эту программу на Linux? – purplepsycho

+0

Я отправляю живое аудио с микрофона. Клиент имеет функцию кодирования фрагментов как raw или wav. Я на Ubuntu. –

+0

Можете ли вы проверить, что ваш wav-файл начинается с чего-то типа 'RIFF', для этого вы можете ввести:' hexdump -C your_file.wav | head' – purplepsycho

ответ

0

Я думаю, что вы не пишете заголовок в своем 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); 
    
0

Я не использовал libsndfile, но я что-то меняю на стороне клиента. Это выходной ток шестнадцатеричного:

00000000 52 49 46 46 20 60 00 00 57 41 56 45 66 6d 74 20 |RIFF `..WAVEfmt | 
00000010 10 00 00 00 01 00 02 00 44 ac 00 00 10 b1 02 00 |........D.......| 
00000020 04 00 10 00 64 61 74 61 00 60 00 00 00 00 00 00 |....data.`......| 
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
* 
00006020 00 00 00 00 00 00 00 00 00 00 00 00 52 49 46 46 |............RIFF| 
00006030 20 60 00 00 57 41 56 45 66 6d 74 20 10 00 00 00 | `..WAVEfmt ....| 
00006040 01 00 02 00 44 ac 00 00 10 b1 02 00 04 00 10 00 |....D...........| 
00006050 64 61 74 61 00 60 00 00 00 00 00 00 00 00 00 00 |data.`..........| 
00006060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
* 
0000c050 00 00 00 00 00 00 00 00 52 49 46 46 20 60 00 00 |........RIFF `..| 
0000c060 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 02 00 |WAVEfmt ........| 
0000c070 44 ac 00 00 10 b1 02 00 04 00 10 00 64 61 74 61 |D...........data| 
0000c080 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.`..............| 
0000c090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
* 

Это, кажется, WAV закодированы, но я не содержание.

Смежные вопросы