【obs-studio开源项目从入门到放弃】obs aac opus 音频编码器的使用


前言

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 的关键函数调用堆栈
obs-ffmpeg-audio-encoders

总结

aac opus音频编码器的创建都是基于 ffmepg的 api进行的。如果对 obs的音频编码线程比较理解,这里只是整个推流过程当中音频编码的处理。

以上都是个人工作当中对obs-studio开源项目的理解,难免有错误的地方,如果有欢迎指出。

若有帮助幸甚。


技术参考

1.本文部分技术点出处:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值