obs-ffmepg
+ -

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

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)

  • 功能:音频输出回调函数
  • 作用:将混音后的音频数据发送到输出设备

101514861609
101641238804

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)。

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!