ffmpeg音频输出
2026-04-15
5
0
ffmpeg解析出的音频会通过回调函数obs_source_output_audio回调输出
static void obs_source_output_audio(obs_source_t *source,
const struct audio_data *data)
- obs_source_t是设备源
- audio_data音频数据
obs_source_output_audio调用source_output_audio_data将音频数据存储在source->audio_input_buf中。
然后在音频线程audio_thread中调用input_and_output。input_and_output通过调用 audio->input_cb即audio_callback函数中再对每个source调用obs_source_audio_render进入调用process_audio_source_tick,实现:
for (size_t ch = 0; ch < channels; ch++) {
circlebuf_peek_front(&source->audio_input_buf[ch], source->audio_output_buf[0][ch], size);
}
即从audio_input_buf取出固定数据大小到audio_output_buf中。
这样在audio_callback进行混音。
process_audio_source_tick函数中不知道为什么会对混音器mixers=0的audio_output_buf数据又清0,导致0混音器无法混音。
其执行过程如下:
- process_audio:如果需要,将data数据重新采样,并将数据存储source->audio_data中
- filter_async_audio:执行其支持的各个filter特效,结果依旧在source->audio_data中
- source_output_audio_data 输出音频数据
source_output_audio_data
source_output_audio_data函数是通过调用注册到该音频输入源的回调函数实现的。
- source_output_audio_data
- source_output_audio_push_back or source_output_audio_place
- source_signal_audio_data
- audio_thread
- input_and_output
- audio_callback
- obs_source_audio_render
- audio_callback
- input_and_output
source_output_audio_push_back函数的功能是将每个音频通道的数据放入对应source->audio_input_buf中。
for (size_t i = 0; i < channels; i++)
circlebuf_push_back(&source->audio_input_buf[i], in->data[i],size);
1. source_output_audio_data (obs-source.c:1378)
- 功能:处理音频数据的时间戳、同步和缓冲
- 作用:音频数据进入OBS系统的入口函数
2. source_output_audio_place / source_output_audio_push_back (obs-source.c:1304/1342)
- 功能:将音频数据放入输入缓冲区
- 作用:根据时间戳选择合适的缓冲策略
3. source_signal_audio_data (obs-source.c:1277)
- 功能:通知注册的音频回调函数
- 作用:音频信号分发机制
4. audio_callback (obs-audio.c:425)
- 功能:核心音频处理回调函数
- 作用:收集所有音频源的数据并触发渲染
5. obs_source_audio_render (obs-source.c:4804)
- 功能:渲染单个音频源
- 作用:将音频数据从输入缓冲区转移到输出缓冲区
6. mix_audio (obs-audio.c:49)
- 功能:多混音器音频混音
- 作用:使用加法算法将多个音频源混合
7. default_raw_audio_callback (obs-output.c:1809)
- 功能:音频输出回调函数
- 作用:将混音后的音频数据发送到输出设备


struct audio_output_info ai;
ai.name = "Audio";
ai.samples_per_sec = oai->samples_per_sec;
ai.format = AUDIO_FORMAT_FLOAT_PLANAR;
ai.speakers = oai->speakers;
ai.input_callback = audio_callback; //所有音频源的回调
typedef struct audio_output audio_t;
audio_output_info --参数生成--->struct audio_output
结构体:
struct audio_output {
struct audio_output_info info;
size_t block_size;
size_t channels;
size_t planes;
pthread_t thread;
os_event_t *stop_event;
bool initialized;
audio_input_callback_t input_cb;//指定时间区间的音频混音-在input_and_output函数中调用
void *input_param;
pthread_mutex_t input_mutex;
struct audio_mix mixes[6];
};
#define TOTAL_AUDIO_SIZE \
(6 * 8 * 1024 * sizeof(float))
struct audio_mix {
DARRAY(struct audio_input) inputs;//这是第i混音器对应的音频输出端
float buffer[8][1024];//8个通道,每个1024frames
};
所以,是音频源缓存其对应的数据到缓冲区,在音频线程中分别获取各个音频源时间区间的数据进行混音,分别混音到其指定的混音器中。各个混音器又存储者其混音后的音频数据的使用端(do_audio_output)。
obs-ffmepg





