obs系列文章入口:https://blog.csdn.net/qq_33844311/article/details/121479224
这篇文章介绍一下 obs-ffmpeg-audio-encoders.c 文件中的两个音频编码器。 支持的编码器有 AAC Opus 两种音频编码。这两种编码器的创建和使用都是基于 ffmpeg 的 libavcodec 相关 api
需要注意的一点是这两个音频编码器只是作为直播网络流的音频编码器。如果是本地视频录制,会直接使用 ffmpeg_output 插件,这个输出插件内部处理视频编码和音频编码,支持更丰富的流媒体协议,以及音视频编码器。
在 obs-ffmpeg-audio-encoders.c -> enc_create 的入口设置好端点,点击UI 开始推流,得到下面创建 aac 音频编码器的调用堆栈,可以看到是在 obs_output_initialize_encoders() 初始化编码器函数里面做的 aac编码器的初始化。
具体的音频编码器创建步骤参考源码即可,都是 ffmpeg libavcodec api 的使用。
> obs-ffmpeg.dll!enc_create(obs_data * settings, obs_encoder * encoder, const char * type, const char * alt) 行 273 C
obs-ffmpeg.dll!aac_create(obs_data * settings, obs_encoder * encoder) 行 288 C
obs.dll!obs_encoder_initialize_internal(obs_encoder * encoder) 行 462 C
obs.dll!obs_encoder_initialize(obs_encoder * encoder) 行 507 C
obs.dll!initialize_audio_encoders(obs_output * output, unsigned __int64 num_mixes) 行 2037 C
obs.dll!obs_output_initialize_encoders(obs_output * output, unsigned int flags) 行 2106 C
obs-outputs.dll!rtmp_stream_start(void * data) 行 1216 C
obs.dll!obs_output_actual_start(obs_output * output) 行 256 C
obs.dll!obs_output_start(obs_output * output) 行 293 C
obs64.exe!SimpleOutput::StartStreaming(obs_service * service) 行 913 C++
obs64.exe!OBSBasic::StartStreaming() 行 6396 C++
obs64.exe!OBSBasic::on_streamButton_clicked() 行 7506 C++
obs64.exe!OBSBasic::qt_static_metacall(QObject * _o, QMetaObject::Call _c, int _id, void * * _a) 行 1315 C++
obs64.exe!OBSBasic::qt_metacall(QMetaObject::Call _c, int _id, void * * _a) 行 1511 C++
[外部代码]
obs64.exe!run_program(std::basic_fstream<char,std::char_traits<char>> & logFile, int argc, char * * argv) 行 2145 C++
obs64.exe!main(int argc, char * * argv) 行 2841 C++
obs64.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal) 行 97 C++
enc_create 函数的第三个参数指定创建的音频编码器类型
static void *enc_create(obs_data_t *settings, obs_encoder_t *encoder, const char *type, const char *alt);
// 创建 aac 编码器
static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder)
{
return enc_create(settings, encoder, "aac", NULL);
}
// 创建 opus 编码器
static void *opus_create(obs_data_t *settings, obs_encoder_t *encoder)
{
return enc_create(settings, encoder, "libopus", "opus");
}
真正做音频编码的函数调用堆栈如下。在 obs的音频编码输出线程做音频编码。
具体细节可以参考这篇文章:audio_thread 音频编码线程理解
> obs.dll!send_audio_data(obs_encoder * encoder) 行 1198 C
obs.dll!receive_audio(void * param, unsigned __int64 mix_idx, audio_data * in) 行 1299 C
obs.dll!do_audio_output(audio_output * audio, unsigned __int64 mix_idx, unsigned __int64 timestamp, unsigned int frames) 行 126 C
obs.dll!input_and_output(audio_output * audio, unsigned __int64 audio_time, unsigned __int64 prev_time) 行 201 C
obs.dll!audio_thread(void * param) 行 241 C
w32-pthreads.dll!ptw32_threadStart(void * vthreadParms) 行 225 C
具体的音频编码步骤参考源码即可。
下面贴一张 XMind截图 obs-ffmpeg-audio-encoders 的关键函数调用堆栈
aac opus音频编码器的创建都是基于 ffmepg的 api进行的。如果对 obs的音频编码线程比较理解,这里只是整个推流过程当中音频编码的处理。
以上都是个人工作当中对obs-studio开源项目的理解,难免有错误的地方,如果有欢迎指出。
若有帮助幸甚。
1.本文部分技术点出处:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发