ffmpeg学习九:音频编码前奏-ubuntu下录音和播放

这篇博客介绍了在Ubuntu环境下使用ffmpeg进行音频处理,包括如何录制5秒音频到audio.pcm文件,播放原始音频数据,以及播放wav格式的音频文件。录音和播放过程涉及设置参数、数据采集和文件操作,编译和运行示例代码可以实现音频的录制与回放。
摘要由CSDN通过智能技术生成

上一篇博客,我们把一个Yuv编码格式的视频文件编码为H264格式。那么接下来,自然要学习下音频编码了。在学习音频编码之前,我们先看看ubuntu下如何采集声音和播放声音。

录音

录制5秒钟的一段音频。
audio_recorder.c:

/*created by Jinwei Liu*/
#define ALSA_PCM_NEW_HW_PARAMS_API  

#include <alsa/asoundlib.h>  

int main(int argc,char **argv) {  
  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;  
  FILE * fd_out;
  if(argc!=2){
    printf("usage:./a.out outfile\n");
  }
  /* 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);  

  /* 11025 bits/second sampling rate (CD quality) */  
  val = 11025;  
  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;  
  fd_out = fopen(argv[1],"w+");
  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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值