2016-07-27 101 views
0

私は音を録音してCプログラムで再生しようとしています。 ちょうどそれらの端末回線を使用してのように:CでALSAを使用したラズベリーパイの録音と再生

arecord -D plughw:0 -r 16000 sample.wav 
レコードの

、と後で

aplay sample.wav 

サウンドを再生します。

私はこのコードを使用:私ははaplay「でこれを再生しようとした場合

./recorder < sample.wav 

gcc -o recorder -lasound recorder.c 

し、それを実行します。私はこのファイルをこのようにコンパイル

/* 


This example reads from the default PCM device 
and writes to standard output for 5 seconds of data. 


*/ 


/* Use the newer ALSA API */ 
#define ALSA_PCM_NEW_HW_PARAMS_API 


#include <alsa/asoundlib.h> 


int main() { 
    long loops; 
    int rc; 
    int size; 
    snd_pcm_t *handle; 
    snd_pcm_hw_params_t *params; 
    unsigned int val; 
    int dir; 
    snd_pcm_uframes_t frames; 
    char *buffer; 


    /* Open PCM device for recording (capture). */ 
    rc = snd_pcm_open(&handle, "default", 
        SND_PCM_STREAM_CAPTURE, 0); 
    if (rc < 0) { 
    fprintf(stderr, 
      "unable to open pcm device: %s\n", 
      snd_strerror(rc)); 
    exit(1); 
    } 


    /* Allocate a hardware parameters object. */ 
    snd_pcm_hw_params_alloca(&params); 


    /* Fill it in with default values. */ 
    snd_pcm_hw_params_any(handle, params); 


    /* Set the desired hardware parameters. */ 


    /* Interleaved mode */ 
    snd_pcm_hw_params_set_access(handle, params, 
         SND_PCM_ACCESS_RW_INTERLEAVED); 


    /* Signed 16-bit little-endian format */ 
    snd_pcm_hw_params_set_format(handle, params, 
           SND_PCM_FORMAT_S16_LE);         


    /* Two channels (stereo) */ 
    snd_pcm_hw_params_set_channels(handle, params, 2);         


    /* 44100 bits/second sampling rate (CD quality) */ 
    val = 44100;              
    snd_pcm_hw_params_set_rate_near(handle, params, 
            &val, &dir); 


    /* Set period size to 32 frames. */ 
    frames = 32; 
    snd_pcm_hw_params_set_period_size_near(handle, 
           params, &frames, &dir); 


    /* Write the parameters to the driver */ 
    rc = snd_pcm_hw_params(handle, params); 
    if (rc < 0) { 
    fprintf(stderr, 
      "unable to set hw parameters: %s\n", 
      snd_strerror(rc)); 
    exit(1); 
    } 


    /* Use a buffer large enough to hold one period */ 
    snd_pcm_hw_params_get_period_size(params, 
             &frames, &dir); 
    size = frames * 4; /* 2 bytes/sample, 2 channels */ 
    buffer = (char *) malloc(size); 


    /* We want to loop for 5 seconds */ 
    snd_pcm_hw_params_get_period_time(params, 
             &val, &dir); 
    loops = 5000000/val; 


    while (loops > 0) { 
    loops--; 
    rc = snd_pcm_readi(handle, buffer, frames); 
    if (rc == -EPIPE) { 
     /* EPIPE means overrun */ 
     fprintf(stderr, "overrun occurred\n"); 
     snd_pcm_prepare(handle); 
    } else if (rc < 0) { 
     fprintf(stderr, 
       "error from read: %s\n", 
       snd_strerror(rc)); 
    } else if (rc != (int)frames) { 
     fprintf(stderr, "short read, read %d frames\n", rc); 
    } 
    rc = write(1, buffer, size); 
    if (rc != size) 
     fprintf(stderr, 
       "short write: wrote %d bytes\n", rc); 
    } 


    snd_pcm_drain(handle); 
    snd_pcm_close(handle); 
    free(buffer); 


    return 0; 
} 

をsample.wav "これはひどい騒々しい音を作り出しています。 私が "aplay -t raw -f S16_LE -c2 -r44100 sample.wav"を使用した場合、 はうまくいきます。

私が間違っていることと、オーディオをキャプチャしてラズベリーパイで再生する簡単な方法がある場合はどうすればいいですか?

ありがとうございます。

答えて

0

これは単なる基本的なことです。aplay sample.wav"「aplay」は、ファイル内にwaveヘッダーとそのヘッダーがないかどうかを調べます。だから、いくつかの他のフォーマット(サンプリング周波数、チャンネルなど)とのその演奏。なぜあなたのオーディオは騒々しくなるのですか?

しかし、aplay -t raw -f S16_LE -c2 -r44100 sample.wavには、必要なすべての情報と正常に機能しています。

関連する問題