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。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值