libav杂碎

音频输出的每个采样(Sample)数据类型和布局
   libav音频输出格式为原始波形数据,即PCM(模拟脉冲信号)或者Wave数据。每一个Sample的数据类型可能为uint8, int16, int32, float, double, 见枚举类型AVSampleFormat:
enum AVSampleFormat
{
    AV_SAMPLE_FMT_NONE = -1,
    AV_SAMPLE_FMT_U8,          ///< unsigned 8 bits
    AV_SAMPLE_FMT_S16,         ///< signed 16 bits
    AV_SAMPLE_FMT_S32,         ///< signed 32 bits
    AV_SAMPLE_FMT_FLT,         ///< float
    AV_SAMPLE_FMT_DBL,         ///< double

    AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar
    AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar
    AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar
    AV_SAMPLE_FMT_FLTP,        ///< float, planar
    AV_SAMPLE_FMT_DBLP,        ///< double, planar

    AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if linking dynamically
};

整形Sample的取值范围就是该整数类型的理论取值范围,比如AV_SAMPLE_FMT_U8的取值范围是从0到255,AV_SAMPLE_FMT_S16的取值范围是从-32768到32767.而浮点数有点不太一样,取值范围从-1.0到1.0。 数据类型越大,表示可以用于表示声音的范围越大,听起来也就越“高大上”

AVCodecContext有这几个成员request_channel(过时), request_channel_layout, request_sample_fmt. 通过在解码之前设定这几个成员,libav允许你指定解码后的Sample数据类型。

如果你真这么测试的话,你会发现解码后的Sample类型可能与你指定的不一致。这是因为,每个编码解码器都有支持的类型,比如说AAC编码只支持AV_SAMPLE_FMT_FLTP(在以前的版本上为AV_SAMPLE_FMT_S16),所以你需要在编码解码器支持的类型之上进行指定。

那么怎么才能知道某个编码解码器支持哪些音频采样格式(或者图像格式)呢,还暂时不是很清楚。不过应该有某种机制可以知道。

注意到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),另外一种就是自己根据上面说到的布局来手动解决了。

转载于:https://www.cnblogs.com/jianqifeihong/p/3477935.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在freeswitch中安装libav,您可以按照以下步骤进行操作: 1. 首先,确保您已经下载了freeswitch的安装包,其中应该包含libav相关的文件,如引用所示。 2. 接下来,您需要安装cmake、libks、libuuid和signalwire-c,这些是freeswitch安装过程中所需的依赖项。 3. 下一步是安装libav,您可以使用wget命令下载libav的tar.bz2压缩包。具体命令如引用所示。确保您已经下载了适当版本的libav,并将其放置在合适的位置。 4. 解压缩libav压缩包,并按照其中的说明进行安装。通常,您需要运行configure、make和make install命令来完成安装过程。具体的安装步骤可能因libav的版本而有所不同,请参考libav的文档或官方网站获取更详细的安装指南。 5. 安装完成后,您可以使用freeswitch来调用和使用libav库来处理音视频相关的任务。具体的操作方式和代码实现取决于您的具体需求和使用场景。 希望以上信息对您有所帮助,如果您还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [freeswitch 安装全部资源包](https://download.csdn.net/download/abner_xf/85506592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [freeswitch-1.10.7 on centos7编译安装](https://blog.csdn.net/qiuzhendezhen/article/details/127536808)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值