2016-05-11 4 views
1

Ich habe einen C-Server, der libwebsockets verwendet, und ich möchte einen empfangenen Audiostream in einer Datei auf der Festplatte speichern.Speichern Sie Audio-Stream in Datei mit C libwebsockets

Hier ist mein Code-Schnipsel:

#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); 
      } 
     } 
    } 
} 

Ich habe die Nachricht „Client verbunden ist“ und auch die Datei, aber der Inhalt ist nicht in Ordnung, ich kann es nicht spielen. Ich denke, es gibt ein Problem in Bezug auf die Art, wie ich den Stream in der Datei unter Verwendung fwrite() speichern.

Der Client sendet Audio-Chunks, die als WAV, 16Khz, Mono codiert sind. Hier ist ein Ausschnitt vom Client (es ist ein Javascript-Client, der vollständige Code ist hier: http://kaljurand.github.io/dictate.js/).

Der Client funktioniert gut, ich benutze es für genau die gleiche Aufgabe, aber mit einem Java-Server. Ich würde mich freuen, wenn mir jemand zeigen könnte, wie man diese Audio-Chunks in einer gültigen Datei speichert.

+0

Können Sie die Datei vergleichen, die Sie versuchen, mit der auf der Festplatte geschriebenen Datei zu senden? Ich nehme an, dass Sie dieses Programm auf Linux ausführen? – purplepsycho

+0

Ich sende Live-Audio vom Mikrofon. Der Client hat eine Funktion zum Codieren von Stücken als Roh- oder WAV. Ich bin auf Ubuntu. –

+0

Können Sie überprüfen, ob Ihre WAV-Datei mit etwas wie 'RIFF' beginnt? Um dies zu tun, können Sie Folgendes eingeben:' hexdump -C your_file.wav | Kopf " – purplepsycho

Antwort

0

Ich denke, dass Sie nicht Header in Ihrer WAV-Datei schreiben. Dazu

  • können Sie eine Funktion schreiben zu tun, so sehen specification here
  • oder Sie können eine dedicaded Bibliothek verwenden, wie libsndfile, die nicht so kompliziert zu bedienen ist:

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

Ich habe nicht libsndfile verwendet, aber ich ändere etwas auf der Clientseite. Dies ist die aktuelle hexdump Ausgabe:

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 |................| 
* 

Es scheint, codiert wird wav, aber ich habe keinen Inhalt.

Verwandte Themen