有关音频样本类型分析

原因:利用libfdk_aac进行音频转换后,会发现音频的样本类型前后被修改.在此进行分析libfdk和aac编码有关音频sample_format的区别.

总的来说音频样本类型主要有如下几种

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_S64,         ///< signed 64 bits
    AV_SAMPLE_FMT_S64P,        ///< signed 64 bits, planar

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

当我们解码时,AVCodecContex内部的AVSampleFormat参数被明确指明编码时需要由用户手动指定,解码时由AVCodec指定.故此我不确定在不同codec时avcodec指定的AVSampleFormat是否和原始文件样本类型相同?接下来进行验证.

 

mp3文件转m4a命令如下:

HEV1模式:
ffmpeg.exe -i music.mp3 -i ori.mp3 -map 0:a  -map 1:a -movflags faststart -loglevel trace -acodec libfdk_aac -profile:a aac_he OutV1.m4a

HEV2模式:
ffmpeg.exe -i music.mp3 -i ori.mp3 -map 0:a  -map 1:a -loglevel trace -ar 48000 -movflags faststart -acodec libfdk_aac -profile:a aac_he_v2 OutV2.m4a


AAC-LC模式:
ffmpeg.exe -i music.mp3 -i ori.mp3 -map 0:a  -map 1:a -acodec libfdk_aac -ar 48000 -movflags faststart -loglevel trace OutLC.m4a

普通AAC模式:
ffmpeg.exe -i music.mp3 -i ori.mp3 -map 0:a  -map 1:a -acodec aac -ar 48000 -movflags faststart -loglevel trace OutLC.m4a

-map:第一个输入对应map 0,第二个输入对应map 1,以此类推.

可知输入mp3文件信息为44100Hz,stereo,s16p,128kb/s.而通过libfdk_aac和aac进行编码最终生成的样本类型是不同的.如下

native aac:可以看出native aac编码后生成的样本类型为fltp.

fdk_aac:编码后生成的样本类型为s16

观看源码可以发现native aac编解码支持的样本类型为如下:AV_SAMPLE_FMT_FLTP。

而libfdk_aac编码支持的样本类型如下:AV_SAMPLE_FMT_S16.

故通过观看源码与上述的实验相符合.

音频常规命令行操作:

mp3转成wav

ffmpleg -i ori.mp3 -acodec libmp3lame -ac 2 -ar 48000 output.wav  

ffmpleg -i ori.mp3 -acodec libmp3lame -ac 2 -ar 48000 -ab 320k output.wav

-ac :设置通道.缺省为输入相同值. 
-ar:设置采样率,缺省为输入相同值
-acodec:为编解码类型.
-ab:设置音频码率,缺省码率和输入相同.

mp3转换成pcm:

ffmpeg -i ori.mp3 -f s32le -acodec pcm_s32le -ac 2-ar 48000 output.pcm 

ffmpeg -i ori.mp3 -f s16le -acodec pcm_s16le -ac 2-ar 48000 output.pcm 

-f:指定输出pcm文件的样本类型,当前测试发现只有在pcm文件生成时才会指定.


利用ffplay播放pcm文件如下:
ffplay.exe -f s32le -ar 48000 -ac 2 output.pcm

总结:

AVCodecContext中的AVSampleFormat在不同的codec时对应的样本类型也不同.虽然解码时需要由AVCodec指定.但是该指定的AVStampleFormat并不是真实的文件样本类型,而是解码器支持的样本类型,目前在使用命令行进行格式转换时并不能指定输出文件样本类型,除了在生成pcm文件之外。如果有不同想法希望留言一起交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值