Linuxのソケットレイヤーを使用してC ++で.wavファイルを作成するにはどうすればよいですか?

user2212461

Linux上のTCP経由でソケットを介してC ++でwavファイルを送信しようとしていますが、wavファイルを正しく読み取る方法がわかりません。

私の目標は、クライアント上のファイルをchar配列に読み込み、「write()」を使用してサーバーに送信することです。サーバーは、データをローカルのwavファイルに再度書き込む必要があります。

私は次のように.wavファイルを読みました:

////////////define socket - left out for simplicity

ifstream file ("audio.wav", ios::in|ios::binary|ios::ate); //open .wav file
char * buffer; //declare data buffer, should contain .wav data to write to socket
streampos filesize; //size of file
int n; //number of written bytes

//if file opened correctly, read content and write to socket
if (file.is_open()){
    filesize = file.tellg();
    buffer = new char [filesize];
    file.seekg (0, ios::beg);
    file.read (buffer, filesize);
    file.close();
    n = write(socket, buffer, sizeof(buffer));
 }

サーバーでは、これは長さ「4」の配列「RIFF」を返すため、wavファイルのヘッダーの一部になります。

TCPソケットに書き込むために.wavファイルの内容全体を正しく読み取るにはどうすればよいですか?

ありがとう。

それは簡単です:filesizeバイト単位のファイルのサイズです。ただし、sizeof(buffer)32ビットOSでは4つだけです。次のようにコードを変更します。

if(file.is_open()) {
    filesize = file.tellg();
    buffer = new char [filesize];
    file.seekg (0, ios::beg);
    file.read (buffer, filesize);
    file.close();
    n = write_all(socket, buffer, filesize); // use filesize here
    delete[] buffer; // !!
}

反対側の処理を簡素化するために、filesize最初に送信して、受け入れるバイト数を知るためのRIFFヘッダーの解析を回避することをお勧めしますまた、小さいバッファを割り当て、数回読み取って大きいファイルを送信することをお勧めします。

if(file.is_open()) {
    filesize = file.tellg();
    file.seekg(0, ios::beg);

    uint32_t remains = filesize;
    write(socket, &remains, sizeof(uint32_t));
    // write 4B with size of the file (optional)

    buffer = new char[(filesize > 4096)? 4096 : filesize];
    // only up to 4k buffer to avoid running out of memory

    n = 0;
    while(remains > 0) {
        int chunk = (remains > 4096)? 4096 : remains;
        // decide how much to read in at one time (not more than size of the buffer)

        file.read(buffer, chunk);
        n += write_all(socket, buffer, chunk);
        // read a chunk and write it to the socket

        remains -= chunk;
        // update number of bytes that remains to be transferred
    }
    // send the file several times

    file.close();
    delete[] buffer; // !!
}

ヘルパー関数の使用に気付くかもしれませんwrite_allソケットがいっぱいになり、write与えられたすべてのデータが書き込まれない可能性があるため、これは必須ですこれは次のようになります。

size_t write_all(int socket, const char *buffer, size_t size)
{
    size_t n = 0;
    while(size > 0) {
        size_t written = write(socket, buffer, size);
        if(written == -1)
            return written; // handle errors
        n += written;
        size -= written;
    }
    return n;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

大量のwavファイルからtensorflow.data.Datasetapiを使用してデータセットを作成するにはどうすればよいですか?

分類Dev

wavファイルのURLを使用してRにwavファイルをロードするにはどうすればよいですか?

分類Dev

iOSで、データからオーディオファイル(.wav、.mp3)ファイルを作成するにはどうすればよいですか?

分類Dev

ffmpegでこのwavファイルを正しく出力するにはどうすればよいですか?

分類Dev

WAVファイルからオーディオISOファイルを作成するにはどうすればよいですか?

分類Dev

WAVファイルからオーディオISOファイルを作成するにはどうすればよいですか?

分類Dev

Rust SDL2でWAVファイルを再生するにはどうすればよいですか?

分類Dev

MixMonitorで録音された通話ごとに新しいwavファイルを自動的に作成するにはどうすればよいですか?

分類Dev

Pythonでマルチチャネル.WAVファイルを作成するにはどうすればよいですか?

分類Dev

ファイル穴のあるファイルを作成するにはどうすればよいですか?

分類Dev

pepkファイルからjskファイルを作成するにはどうすればよいですか?

分類Dev

PHPファイルからHTMLファイルを作成するにはどうすればよいですか?

分類Dev

tcpdumpとc ++を使用してファイルを再作成するにはどうすればよいですか?

分類Dev

C ++を使用してBMPファイルを作成するにはどうすればよいですか?

分類Dev

C#を使用して.txtファイルを作成するにはどうすればよいですか?

分類Dev

C ++のFFmpegでRAWファイルをオーディオファイル(.wav)に変換するにはどうすればよいですか?

分類Dev

Linuxで作成されたファイルをWindowsで表示するにはどうすればよいですか?

分類Dev

ソケットからデータを取得してprotobufファイルを作成するにはどうすればよいですか?

分類Dev

ファイルのショートカットを作成するにはどうすればよいですか?

分類Dev

Pythonでeggファイルを作成してロードするにはどうすればよいですか?

分類Dev

jarファイルで内部メソッドを作成するにはどうすればよいですか?

分類Dev

AzureストレージにXMLファイルを作成するにはどうすればよいですか?

分類Dev

Xcodeを使用して.ipaファイルを作成するにはどうすればよいですか?

分類Dev

Pythonを使用して.rarファイルを作成するにはどうすればよいですか?

分類Dev

Javaを使用してVSDXファイルを作成するにはどうすればよいですか?

分類Dev

Java jsonGeneratorを使用してjsonファイルを作成するにはどうすればよいですか?

分類Dev

Netbeans 8.0.2を使用してJARファイルを作成するにはどうすればよいですか?

分類Dev

Intellijを使用してLibgdxjarファイルを作成するにはどうすればよいですか?

分類Dev

ループで複数のファイルを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    大量のwavファイルからtensorflow.data.Datasetapiを使用してデータセットを作成するにはどうすればよいですか?

  2. 2

    wavファイルのURLを使用してRにwavファイルをロードするにはどうすればよいですか?

  3. 3

    iOSで、データからオーディオファイル(.wav、.mp3)ファイルを作成するにはどうすればよいですか?

  4. 4

    ffmpegでこのwavファイルを正しく出力するにはどうすればよいですか?

  5. 5

    WAVファイルからオーディオISOファイルを作成するにはどうすればよいですか?

  6. 6

    WAVファイルからオーディオISOファイルを作成するにはどうすればよいですか?

  7. 7

    Rust SDL2でWAVファイルを再生するにはどうすればよいですか?

  8. 8

    MixMonitorで録音された通話ごとに新しいwavファイルを自動的に作成するにはどうすればよいですか?

  9. 9

    Pythonでマルチチャネル.WAVファイルを作成するにはどうすればよいですか?

  10. 10

    ファイル穴のあるファイルを作成するにはどうすればよいですか?

  11. 11

    pepkファイルからjskファイルを作成するにはどうすればよいですか?

  12. 12

    PHPファイルからHTMLファイルを作成するにはどうすればよいですか?

  13. 13

    tcpdumpとc ++を使用してファイルを再作成するにはどうすればよいですか?

  14. 14

    C ++を使用してBMPファイルを作成するにはどうすればよいですか?

  15. 15

    C#を使用して.txtファイルを作成するにはどうすればよいですか?

  16. 16

    C ++のFFmpegでRAWファイルをオーディオファイル(.wav)に変換するにはどうすればよいですか?

  17. 17

    Linuxで作成されたファイルをWindowsで表示するにはどうすればよいですか?

  18. 18

    ソケットからデータを取得してprotobufファイルを作成するにはどうすればよいですか?

  19. 19

    ファイルのショートカットを作成するにはどうすればよいですか?

  20. 20

    Pythonでeggファイルを作成してロードするにはどうすればよいですか?

  21. 21

    jarファイルで内部メソッドを作成するにはどうすればよいですか?

  22. 22

    AzureストレージにXMLファイルを作成するにはどうすればよいですか?

  23. 23

    Xcodeを使用して.ipaファイルを作成するにはどうすればよいですか?

  24. 24

    Pythonを使用して.rarファイルを作成するにはどうすればよいですか?

  25. 25

    Javaを使用してVSDXファイルを作成するにはどうすればよいですか?

  26. 26

    Java jsonGeneratorを使用してjsonファイルを作成するにはどうすればよいですか?

  27. 27

    Netbeans 8.0.2を使用してJARファイルを作成するにはどうすればよいですか?

  28. 28

    Intellijを使用してLibgdxjarファイルを作成するにはどうすればよいですか?

  29. 29

    ループで複数のファイルを作成するにはどうすればよいですか?

ホットタグ

アーカイブ