音视频推流端 OBS 框架学习和源码分析

本文详细介绍了OBS音视频推流框架的工作流程,从获取混音后的音频数据、遍历和渲染源、处理混音,到编码和发送。主要涉及音频数据的混音、渲染、处理、编码等关键步骤,对于理解OBS推流机制非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

音视频推流端 OBS 框架学习和源码分析

1.获取混音后的音频数据:

接口:<audio-io.c> input_and_output (struct audio_output *audio, uint64_t audio_time, uint64_t prev_time)

注释:清空所有混音器audio->mixes中的每个混音器的buff,并逐个将混音器的每个声道buff指针赋值给局部变量audio_output_data data[MAX_AUDIO_MIXES],调用已绑定的回调函数 audio->input_cb (audio->input_param, prev_time, audio_time, &new_ts, active_mixes, data)获取新的音频数据,通过修改局部变量data中各个指针的buff内容,来完成修改 audio->mixes 中的每个混音器的buff内容,audio->input_cb回调函数绑定的接口为 obs-audio.c 中的 audio_callback

2.各个source音频遍历:

接口:<obs-audio.c> audio_callback (void *param,uint64_t start_ts_in, uint64_t end_ts_in, uint64_t *out_ts,uint32_t mixers, struct audio_output_data *mixes)

注释:获取音频码率 sample_rate ,音频声道 channels,遍历当前场景中的所有源( source ),加入到音频的渲染队列 audio->render_order 中 push_audio_tree (NULL, source, audio);以及 audio->root_nodes 中,da_push_back ( audio->root_nodes , &source );把系统自带的音频输入输出音频源(如音响和麦克风)加入到渲染队列 audio->render_order 中,source = data->first_audio_source;
    while (source) {
        push_audio_tree(NULL, source, audio);
        source = (struct obs_source*)source->next_audio_source;
    }
    循环调用接口 obs_source_audio_render 对渲染队列中的所有源做音频数据渲染,每个渲染完成的音频数据存放在 source->audio_output_buf 中;

3.各个source音频渲染:

接口:<obs-source.c> void obs_source_audio_render(obs_source_t *source, uint32_t mixers,size_t channels, size_t sample_rate, size_t size)

注释:如果绑定了音频渲染器,则调用custom_audio_render:

static void custom_audio_render(obs_source_t *source, uint32_t mixers,size_t channels, size_t sample_rate)
 将源的音频输出buff指针赋值给局部变量obs_source_audio_mix audio_data
 audio_data.output[mix].data[ch] = source->audio_output_buf[mix][ch];
  调用source->info.audio_render回调函数,填充audio_data中各个buff的内容,调用完成后source->audio_output_buf中的音频数据填充完成,该回调绑定接口为obs-scene.c中的scene_audio_render(),具体是如何获取的没再细看,否则调用process_audio_source_tick:
static inline

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值