swr_convert音频重采样成AV_SAMPLE_FMT_FLTP

在网上很多的教程,利用swr_convert来进行音频的重采样,但有时候我们发现有些转换成AV_SAMPLE_FMT_S16是没有问题的,但一旦是AV_SAMPLE_FMT_FLTP 时候,程序直接崩溃,这是因为网上有些教程里那个buffer是自定义一个连续的片段,然后直接丢给swr_convert,但这样在s16上是没有问题,s16上只占用了frame->data[0],但一旦是AV_SAMPLE_FMT_FLTP时候,它需要的不仅仅是data[0],还有data[1],而网上的一般直接是一个buf =(uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE*2*sizeof(uint8_t) )这样的结果只能保证data[0],所以应该去参考ffmpeg 里demo的resampling_audio,那里提供一个正确的思路来进行重采样,或者你可以选择利用滤镜来进行重采样。

引用http://www.cnblogs.com/jianqifeihong/archive/2013/12/17/3477935.html里的话就是带不带p的问题。

注意到AVSampleFormat里面还有几种格式以P(Planar,平面)结尾,那它们与不带P的有什么区别呢?当有多个Channel的时候,就有区别了。不带P的只有一个buffer,buffer里面Sample的分布是像这样A1B1A2B2A3B3......其中大写字母代表一个Channel,数字代表每个采样在该Channel里的编号。可以看出所有采样被放到一起(即一个buffer),不同的Channel被均匀的分布在其中。而带P的是像这样A1A2A3......B1B2B3......不同Channel各占一个buffer,且每个buffer长度一样。

音频解码之后,需要发送到第三方的音频输出库进行播放。可是这些播放库不一定支持libav的所有格式,前面说过AAC编码只会输出float planar类型的采样,那要怎样在不支持float planar的音频输出设备(比如Windows的WaveOut)上输出呢?有两种方法(其实是一种,两种方法原理一样),一个是采用libav的resample API(我试了半天,程序老是会crash),另外一种就是自己根据上面说到的布局来手动解决了。

在这里还要说一下程序又是编写特定视频时候有时突然crash,万恶的Win开发,让我总是看不到崩溃的原因,一直怀疑是别的线程导致的,但最后还是没有。最后不得不换位思考,我将不同视频再来一次,发现只有特定的才会有概率触发。而且若果将采样高到低没问题,低到高却会。这是才将眼光注意回重采样这边,是的。原来又是这里的 锅。这里的buffer大小是个坑,你要实时地更新那个buffer。
swr_convert是一个音频重采样函数,用于将一个音频流从一个采样率转换为另一个采样率。在音频处理过程中,有时候需要将音频流的采样率进行转换,以适应不同的播放设备或需求。 swr_convert函数的使用步骤如下: 1. 创建一个SwrContext结构体对象,并进行初始化。 2. 设置输入音频流的相关参数,包括采样率、采样格式、声道布局等。 3. 设置输出音频流的相关参数,包括目标采样率、目标采样格式、目标声道布局等。 4. 使用swr_convert函数进行采样率转换,将输入音频数据转换为输出音频数据。该函数需要传入输入缓冲区、输出缓冲区、以及输入音频数据的采样个数。 5. 根据需要,可以使用swr_get_out_samples函数获取实际输出采样个数。 6. 转换完后,可以释放SwrContext结构体对象。 在进行音频采样率转换时,需要注意目标采样率是否合理,以免发生音质损失或其他问题。同时,还需要注意输入和输出音频流的采样格式和声道布局的匹配,以保证能够正确进行转换。在使用swr_convert函数时,还可以设置一些其他参数,如重采样质量、重采样阶段等,以控制转换过程的效果。 总之,swr_convert函数是一个用于音频重采样的功能强大的函数,能够方便地将音频流的采样率进行转换,满足不同设备或需求的要求。在使用时需要注意参数设置和采样格式匹配,以保证转换结果的质量和准确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值