FFmpeg编程学习笔记二:音频重采样

14 篇文章 0 订阅

ffmpeg实现音频重采样的核心函数swr_convert功能非常强大,可是ffmpeg文档对它的注释太过简单,在应用中往往会出这样那样的问题,其实在读取数据->重采样->编码数据的循环中在第一次执行swr_convert后还应用swr_convert再作个缓存检测看看是否还有数据,如果有就要把它写到FIFO中去,留在下次再使用,这点在转码和由低向高转换采样率时特别重要。

     下面一段简单的代码,摘自我自已写的测试程序.


[cpp]  view plain  copy
  1. const int frame_size = FFMIN(fifo_size, m_Opt->encode_pCodecCtx->frame_size);  
  2.   
  3.   
  4. if ((ret = av_audio_fifo_read(m_fifo, (void **)m_fifo_samples_array, frame_size)) < frame_size) {  
  5.     fprintf(stderr, "Could not read data from FIFO\n");  
  6.     return AVERROR_EXIT;  
  7. }  
  8.   
  9. int out_samples = av_rescale_rnd(swr_get_delay(m_Opt->out_resample_context, 48000) + 1536, 44100, 48000, AV_ROUND_UP);  
  10.   
  11.   
  12. int conver_samples= swr_convert(m_Opt->out_resample_context, m_fifo_conver_samples_array, frame_size,  
  13.     (const uint8_t **)m_fifo_samples_array, frame_size);  
  14. ret = av_audio_fifo_size(m_conver_fifo);  
  15.   
  16. if ((ret = av_audio_fifo_realloc(m_conver_fifo, av_audio_fifo_size(m_conver_fifo) + frame_size)) < 0) {  
  17.         fprintf(stderr, "Could not reallocate FIFO\n");  
  18.         return ret;  
  19.     }  
  20.   
  21. ret = av_audio_fifo_write(m_conver_fifo, (void **)m_fifo_conver_samples_array, conver_samples);  
  22.     fifo_size = av_audio_fifo_size(m_conver_fifo);  
  23.   
  24.     if ((ret = av_audio_fifo_read(m_conver_fifo, (void **)m_Opt->out_samples_array, frame_size)) < frame_size) {  
  25.         fprintf(stderr, "Could not read data from FIFO\n");  
  26.         return AVERROR_EXIT;  
  27.     }  
  28.       
  29.     ret = Encode_audio(ret);  
  30.   
  31.     int ret1 = 0;  
  32.   
  33.     while ((ret1 = swr_convert(m_Opt->out_resample_context, m_fifo_conver_samples_array, frame_size, NULL, 0)) > 0)  
  34. {  
  35.   
  36.   
  37.     if ((ret = av_audio_fifo_realloc(m_conver_fifo, av_audio_fifo_size(m_conver_fifo) + ret1)) < 0) {  
  38.         fprintf(stderr, "Could not reallocate FIFO\n");  
  39.         return ret;  
  40.     }  
  41.   
  42.     ret = av_audio_fifo_write(m_conver_fifo, (void **)m_fifo_conver_samples_array, ret1);  
  43.     fifo_size = av_audio_fifo_size(m_conver_fifo);  
  44.   
  45.     if (fifo_size > m_Opt->encode_pFrame->nb_samples)  
  46.     {  
  47.   
  48.         if ((ret = av_audio_fifo_read(m_conver_fifo, (void **)m_Opt->out_samples_array, frame_size)) < frame_size) {  
  49.             fprintf(stderr, "Could not read data from FIFO\n");  
  50.             return AVERROR_EXIT;  
  51.         }  
  52.   
  53.         ret = Encode_audio(ret);  
  54.   
  55.     }  

因为是测试代码,有点乱中间也有一些不必要的步骤,主要是为了调试好用。

重点在:

[cpp]  view plain  copy
  1. if ((r = swr_convert(swr_ctx, output, output_nb_samples,(const uint8_t**)input, nb_samples)) < 0)  
  2.     return -1;  
  3.   
  4. while ((r = swr_convert(swr_ctx, output, output_nb_samples, NULL, 0)) > 0) {  
  5.   
  6. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值