ffmpeg 音频转换

音频转换主要API
swr_alloc_set_opts 设置转换的参数


  /**
         如果需要,分配SwrContext并设置/重置公共参数。
          此函数不需要使用swr_alloc()分配。 另一方面,swr_alloc()可以使用swr_alloc_set_opts()在分配的上下文上设置参数。
          
         * 初始化resampler
         * @param s               现有的Swr上下文(如果可用),否则为NULL
         * @param out_ch_layout   输出通道布局(AV_CH_LAYOUT_ *)
         * @param out_sample_fmt  输出样本格式(AV_SAMPLE_FMT_ *)
         * @param out_sample_rate 输出采样率(频率,单位:Hz)
         * @param in_ch_layout    输入通道布局(AV_CH_LAYOUT_ *)
         * @param in_sample_fmt   输入样本格式(AV_SAMPLE_FMT_ *)
         * @param in_sample_rate  输入采样率(频率,Hz)
         * @param log_offset      logging level offset
         * @param log_ctx          父日志记录上下文,可以为NULL
          返回 错误时为NULL,否则分配上下文
          
         */


truct SwrContext * swr_alloc_set_opts(
    struct SwrContext *s,
    int64_t out_ch_layout, 
    enum AVSampleFormat out_sample_fmt, 
    int out_sample_rate,
     int64_t  in_ch_layout, 
    enum AVSampleFormat  in_sample_fmt,
     int  in_sample_rate,
     int log_offset, void *log_ctx);

swr_convert 在上面转换参数设置后,进行音频转换

  /**
     swr_convert 音频数据转换 (使用avcodec_decode_audio4函数来解码音频,但解码得到的数据类型为float 4bit,而播放器播放的格式一般为S16(signed 16bit),就需要对解码得到的数据进行转换)     in和in_count可以设置为0,以清除最后几个样本
如果提供的输入多于输出空间,则将缓冲输入。 您可以通过使用swr_get_out_samples()检索给定数量的输入样本的所需数量的输出样本的上限来避免这种缓冲。 转换将直接运行而无需复制。
        参数1 s: 分配的Swr上下文,并设置了参数
        参数2 out: 输出缓冲区,如果打包了音频,则仅需要设置第一个
        参数3 out_count: 每通道样本中可用于输出的空间量
        参数4 in: 输入缓冲区,在打包音频的情况下仅需要设置第一个
        参数5 in_count: 一个通道中可用的输入样本数
        返回每个通道输出的样本数,错误时为负值
 */
 int swr_convert(
        struct SwrContext *s, 
        uint8_t **out, 
        int out_count,
        const uint8_t **in ,
        int in_count);

音频转换的原则是时长不变,不管转换成何种格式,音频总时长一样

影响音频播放时长的因素是每帧的采样数和采样率。
现在有mp3 每帧1152, 采样率48000
aac 每帧1024, 采样率44100
44100的aac每帧的播放时长=1024/44100.每秒有44100/1024帧,每个aac采样的播放时长是1/44100秒
48000的mp3,每帧的播放时长=1152/48000,每秒有48000/1152帧。每个mp3采样的播放时长是1/48000秒
这里我们就能看出,不可能一个aac帧转出一个mp3帧,比例不可能1:1 。具体能转多少,需要计算。这就是上面的转换在干的事,到底在转换什么,实质就是转换一个每帧aac里面有1024个采样,看能转出多个mp3性质的采样。

把一帧aac变成一帧mp3,能从每帧aac的1024个采样身上重采样出多少个mp3帧的采样,这个值记作K,就是上面的dst_nb_samples
根据我们的音频总时长不变原则,
(44100/1024) * K * (1/48000)=1秒 (src_rate/src_nb_samples =dst_rate/K)

即1秒钟的aac总帧数每个aac帧能转换的mp3采样数 每个mp3采样的播放时长=转换出来的mp3也是1s
计算得K=1114.57

1114.57是不够一帧mp3帧的,这个数也是一个计算出来的理论值,实际采样个数肯定也不可能是一个小数,实际到底转了多少,sws_convert函数的返回值告诉你,实际编码过程中,我们也是通过累计的方式,够了1152个采样,我们才组装出一个mp3帧

swr_convert 返回的输出样本数,可以根据输入样本数计算出来

条件1: 首先需要满足: out_count(输出通道可以接收的样本空间)> in_count (输入样本数)

否则输入的数据过大,输出接收空间不足以接收所有的输入数据

满足条件1后,可计算swr_convert 返回的输出样本数。
例如
1帧数据,
采样数 pAudioFrame->nb_samples = 1024
输入采样率为 in_sample_rate = 44100
输出采样率 out_sample_rate = 44100 * 2
那么经过swr_convert转换出来的结果就近似 2048 (具体数值以swr_convert返回值为准)
也满足上面的公式

(44100/1024) * K * (1/44100 * 2)=1秒 

swr_alloc_set_opts设置的输出采样频率越高,swr_convert转换的采样数越大,才能保证时间一致

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容

  • 不同于视频采集一帧编码一帧,音频采集和编码之间稍微复杂一些,记录下相关内容 音频采集 在windows上获取音频的...
    玖零儛阅读 12,726评论 0 7
  • Android音频开发(1):基础知识 导读 人的说话频率基本上为300Hz3400Hz,但是人耳朵听觉频率基本上...
    我们都很努力着阅读 724评论 0 2
  • 概述 本片文章主要介绍音频基础,在做音频开发之前首先必须要对音频的相关概念了解。以下是具体内容概述: 常见的音频格...
    iosmedia阅读 2,658评论 0 1
  • 采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。。正常人听觉的频率范围大约在20Hz~20k...
    rogerwu1228阅读 12,301评论 0 3
  • [TOC] 开始前的BB 有些没有接触过的童鞋可能还不知道音视频同步是什么意思,大家印象中应该看到过这样的视频,画...
    Mirs阅读 2,245评论 0 10