博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FFmpeg编程学习笔记二:音频重採样
阅读量:6714 次
发布时间:2019-06-25

本文共 2264 字,大约阅读时间需要 7 分钟。

      ffmpeg实现音频重採样的核心函数swr_convert功能很强大,但是ffmpeg文档对它的凝视太过简单。在应用中往往会出这样那样的问题,事实上在读取数据->重採样->编码数据的循环中在第一次运行swr_convert后还应用swr_convert再作个缓存检測看看是否还有数据。假设有就要把它写到FIFO中去,留在下次再使用,这点在转码和由低向高转换採样率时特别重要。

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

const int frame_size = FFMIN(fifo_size, m_Opt->encode_pCodecCtx->frame_size);	if ((ret = av_audio_fifo_read(m_fifo, (void **)m_fifo_samples_array, frame_size)) < frame_size) {		fprintf(stderr, "Could not read data from FIFO\n");		return AVERROR_EXIT;	}	int out_samples = av_rescale_rnd(swr_get_delay(m_Opt->out_resample_context, 48000) + 1536, 44100, 48000, AV_ROUND_UP);	int conver_samples= swr_convert(m_Opt->out_resample_context, m_fifo_conver_samples_array, frame_size,		(const uint8_t **)m_fifo_samples_array, frame_size);	ret = av_audio_fifo_size(m_conver_fifo);	if ((ret = av_audio_fifo_realloc(m_conver_fifo, av_audio_fifo_size(m_conver_fifo) + frame_size)) < 0) {			fprintf(stderr, "Could not reallocate FIFO\n");			return ret;		}	ret = av_audio_fifo_write(m_conver_fifo, (void **)m_fifo_conver_samples_array, conver_samples);		fifo_size = av_audio_fifo_size(m_conver_fifo);		if ((ret = av_audio_fifo_read(m_conver_fifo, (void **)m_Opt->out_samples_array, frame_size)) < frame_size) {			fprintf(stderr, "Could not read data from FIFO\n");			return AVERROR_EXIT;		}				ret = Encode_audio(ret);		int ret1 = 0;		while ((ret1 = swr_convert(m_Opt->out_resample_context, m_fifo_conver_samples_array, frame_size, NULL, 0)) > 0)	{			if ((ret = av_audio_fifo_realloc(m_conver_fifo, av_audio_fifo_size(m_conver_fifo) + ret1)) < 0) {			fprintf(stderr, "Could not reallocate FIFO\n");			return ret;		}		ret = av_audio_fifo_write(m_conver_fifo, (void **)m_fifo_conver_samples_array, ret1);		fifo_size = av_audio_fifo_size(m_conver_fifo);		if (fifo_size > m_Opt->encode_pFrame->nb_samples)		{			if ((ret = av_audio_fifo_read(m_conver_fifo, (void **)m_Opt->out_samples_array, frame_size)) < frame_size) {				fprintf(stderr, "Could not read data from FIFO\n");				return AVERROR_EXIT;			}			ret = Encode_audio(ret);		}

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

重点在:

if ((r = swr_convert(swr_ctx, output, output_nb_samples,(const uint8_t**)input, nb_samples)) < 0)        return -1;    while ((r = swr_convert(swr_ctx, output, output_nb_samples, NULL, 0)) > 0) {     }

转载地址:http://jqhlo.baihongyu.com/

你可能感兴趣的文章
spring发送邮件
查看>>
typescript实现类规则
查看>>
vue中echarts随窗体变化
查看>>
使用python 3.x 对pythonchallenge-----0的解答过程
查看>>
HBase ZooKeeper安装
查看>>
mvc4,jquery Bundle
查看>>
得到IP
查看>>
关于如何实现浮动元素居中
查看>>
Daily Scrum 11.10
查看>>
vim 中的查找
查看>>
dev使用3
查看>>
ServerVariables变量列表
查看>>
Cocos2d-x for android 使用Box2d报错解决
查看>>
搜狗输入法的评判
查看>>
九、oracle 事务
查看>>
几种线性时间排序
查看>>
08 django模型系统(一)
查看>>
我对 前端 Js 开发方式 架构方向 的 一些看法
查看>>
Linux shell 自启动脚本写法
查看>>
How Many Tables HDOJ
查看>>