FFmpeg编程学习笔记二:音频重采样
来源:互联网 发布:公司网络管理通知 编辑:程序博客网 时间:2024/06/12 00:19
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) { }
0 0
- FFmpeg编程学习笔记二:音频重采样
- FFmpeg编程学习笔记二:音频重采样
- ffmpeg实现音频resample(重采样)(二)
- FFMPEG学习【libavcodec】:音频重采样
- ffmpeg音频重采样分析
- FFMPEG学习【组件文档——音频重采样器】
- ffmpeg实现音频resample(重采样)
- ffmpeg实现音频resample(重采样)
- ffmpeg 利用AVFilter音频重采样
- ffmpeg实现音频resample(重采样)
- ffmpeg实现音频resample(重采样)
- 音频重采样的基本(我的学习笔记)
- 利用ffmpeg中的libswresample模块对音频进行重采样
- FFmpeg swr_convert 音频重采样,编码的噪音问题
- 音频重采样函数
- 音频重采样
- ffmepg音频重采样
- 音频重采样
- visual studio 2013 快速在解决方案资源管理器中定位当前文件
- 讲一讲WiFi快连、SmartConfig、SmartConnect
- hdu 1532 Drainage Ditches
- Java List详解
- 中庸之道,创业必成
- FFmpeg编程学习笔记二:音频重采样
- 【bfs】hdu 1104 Remainder
- 小贝_mysql表优化
- Objective-C学习笔记(二十七)——方法的重载与重写
- 第四篇:报错出现“Run-Time Check Failure #2-Stack around the variable 'p2240' was corrupted
- python抓价记(4)
- 【AekdyCoin】求小于等于N的与N互质的数的和
- android开发笔记之service(一)
- Secure CRT 自动连接中断解决办法