2016-05-11 10 views
1

libwebsocketsを使用するCサーバーがあり、受信したオーディオストリームをディスク上のファイルに保存します。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); 
      } 
     } 
    } 
} 

は、私がメッセージ「クライアントが接続されている」ともファイルを得たが、内容は、私はそれを再生することはできませんOKではありません。私は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 |ヘッド " – purplepsycho

答えて

0

あなたはwavファイルにヘッダを書き込まないと思います。

// 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); 

:これを行うには、

  • は、あなたが使用するのは複雑ではありませんlibsndfileようdedicadedライブラリを、使用することができますspecification here
  • か見そうするために、いくつかの関数を書くことができます

    // 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エンコードされているようですが、内容はありません。

関連する問題