由swr_get_delay想到的

最近在弄pcm的重采样,demo的代码里有一段,百思不得其解。然后忽然之间想开了。

里面的一段是这样的 

/* generate synthetic audio */
        fill_samples((double *)src_data[0], src_nb_samples, src_nb_channels, src_rate, &t);
 
        /* compute destination number of samples */
        dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) +
                                        src_nb_samples, dst_rate, src_rate, AV_ROUND_UP);
        if (dst_nb_samples > max_dst_nb_samples)
        {
            av_freep(&dst_data[0]);
            ret = av_samples_alloc(dst_data, &dst_linesize, dst_nb_channels,
                                   dst_nb_samples, dst_sample_fmt, 1);
            if (ret < 0)
                break;
            max_dst_nb_samples = dst_nb_samples;
        }
 
        /* convert to destination format */
        ret = swr_convert(swr_ctx, dst_data, dst_nb_samples, (const uint8_t **)src_data, src_nb_samples);
        if (ret < 0)
        {
            fprintf(stderr, "Error while converting\n");
            goto end;
        }

其中的 
av_rescale_rnd 我知道啥意思,

swr_get_delay 我也知道是啥意思,(不懂的看函数注释)

那么

swr_get_delay(swr_ctx, src_rate) +  src_nb_samples

代表的是什么意思,为什么这么写呢?
swr_get_delay代表的是下一输入数据与下一输出数据之间的时间间隔。可以认为是函数的执行时间t0,函数执行的这段时间内假设音频源还是在产生数据。

产生 src_nb_samples 也需要一个时间 t1。

==,这样解释有点乱。

可以这样认为,这里写成这样是为了能实时处理。想想一下这个矛盾,这些音频数据,如果处理转换的时间大于产生的时间,那么 产生的时间就会越来越多,数据堆积。写成这样,就计算了一个大的buffer size,用于转换。这样就不会产生数据堆积了
--------------------- 
作者:蓝黑墨水 
来源:CSDN 
原文:https://blog.csdn.net/lanxiaziyi/article/details/52390448 
版权声明:本文为博主原创文章,转载请附上博文链接!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值