由swr_get_delay想到的
2016-09-01 00:22
453 查看
最近在弄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,用于转换。这样就不会产生数据堆积了。
里面的一段是这样的 /* 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,用于转换。这样就不会产生数据堆积了。
相关文章推荐
- 从GetLastError想到的
- freertos.axf: Error: L6218E: Undefined symbol xTaskGetSchedulerState (referred from delay.o).
- [zz] 从new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的
- 由request.getSession()想到的函数参数设计原则
- ffmpeg重采样中swr_convert和swr_get_out_samples的用法
- how to get a polygon
- Humorix Hopes To Get Rich Quick Before "Dot Org" Bubble Bursts
- getCurrentSession()与openSession()的区别
- ajax的post和get的区别
- php curl实现get和post请求
- android获得控件在屏幕中的绝对坐标 getLocationInWindow 和 getLocationOnScreen
- Spring MVC Controller中解析GET方式的中文参数会乱码的问题(tomcat如何解码)
- Runtime.getRuntime().addShutdownHook(shutdownHook);
- process launch failed: failed to get the task for process 7680
- 详解get请求和post请求参数中文乱码的解决办法
- org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleT
- apt-get install 和 pip install的区别
- get address dynamically
- Hibernate中Session.load与Session.get的区别
- JSP和Servlet连接数据库 登陆验证ResultSet.getString("power")空指针问题