OBS-STUDIO-25.0.8版本追加监听设备/辅助1功能

OBS-STUDIO-25.0.8版本追加监听设备/辅助1功能

项目需求需要在windows平台下obs-studio-25.0.8追加一个监听设备。在实现追加监听设备前,需要先解决OBS非输出(PGM)状态下,场景下带音频的源可以向指定监听声卡设备发声(预先在设置中配置好监听设备)。libobs库中obs_source_set_monitoring_type接口负责设置监听。如图中音频监听列。
在这里插入图片描述
(25.0.8版本的OBS-STUDIO默认需要在’已激活’状态下才能监听到声音。)
首先分析obs_source_set_monitoring_type函数。

void obs_source_set_monitoring_type(obs_source_t *source,
				    enum obs_monitoring_type type)
{
	bool was_on;
	bool now_on;

	if (!obs_source_valid(source, "obs_source_set_monitoring_type"))
		return;
	if (source->monitoring_type == type)
		return;

	was_on = source->monitoring_type != OBS_MONITORING_TYPE_NONE;
	now_on = type != OBS_MONITORING_TYPE_NONE;

	if (was_on != now_on) {
		if (!was_on) {
			// 此处创建监听设备并与指定源source关联
			source->monitor = audio_monitor_create(source);
		} else {
			// 关闭监听则销毁源对应的monitor
			audio_monitor_destroy(source->monitor);
			source->monitor = NULL;
		}
	}

	source->monitoring_type = type;
}

struct audio_monitor *audio_monitor_create(obs_source_t *source)
{
	struct audio_monitor monitor = {0};
	struct audio_monitor *out;
	// 初始化monitor,monitor在windows平台下是与wasapi相关结构体, audio_monitor_init中主要就是初始化wasapi相关的结构体,并且将monitor于source关联起来
	if (!audio_monitor_init(&monitor, source)) {
		goto fail;
	}

	out = bmemdup(&monitor, sizeof(monitor));

	pthread_mutex_lock(&obs->audio.monitoring_mutex);
	// 将内存out赋值给obs核心中的音频监听对象
	da_push_back(obs->audio.monitors, &out);
	pthread_mutex_unlock(&obs->audio.monitoring_mutex);


	audio_monitor_init_final(out);
	return out;

fail:
	audio_monitor_free(&monitor);
	return NULL;
}

static void audio_monitor_init_final(struct audio_monitor *monitor)
{
	if (monitor->ignore)
		return;

	monitor->source_has_video =
		(monitor->source->info.output_flags & OBS_SOURCE_VIDEO) != 0;
// 最核心一步,将源、监视插入到源source中的audio_cb_list回调数组中,on_audio_playback回调函数会被调用,调用时取出monitor对应声卡设备和将绑定的源source音频数据发送到monitor初始化好的wasapi设备中混音播放
	obs_source_add_audio_capture_callback(monitor->source,
					      on_audio_playback, monitor);
}


void obs_source_add_audio_capture_callback(obs_source_t *source,
					   obs_source_audio_capture_t callback,
					   void *param)
{
	struct audio_cb_info info = {callback, param};

	if (!obs_source_valid(source, "obs_source_add_audio_capture_callback"))
		return;

	pthread_mutex_lock(&source->audio_cb_mutex);
	// 将源、监视插入到源source中的audio_cb_list回调数组中
	da_push_back(source->audio_cb_list, &info);
	pthread_mutex_unlock(&source->audio_cb_mutex);
}

static void on_audio_playback(void *param, obs_source_t *source,
			      const struct audio_data *audio_data, bool muted)
{// obs-studio 25.0.8版本此处有检查源source是否是激活状态,只有在激活状态下才能播出声音
if (os_atomic_load_long(&source->activate_refs) == 0) {
		goto unlock;
	}}

可以导出obs_source_activate、obs_source_deactivate,obs-studio-25.0.8 libobs库默认是不导出这两个函数的
EXPORT void obs_source_activate(obs_source_t *source, enum view_type type);

EXPORT void obs_source_deactivate(obs_source_t *source, enum view_type type);

经过上述的分析后,基本清楚OBS系统默认的监听设备工作原理及流程(顺带把未激活的音频源直接送监听设备中发声也一并解决了)为了增加一个监听设备,需要向struct obs_core_audio结构中增加对应成员,如下:

struct obs_core_audio {
......
	///
	// start add by $hawn 20201104 包含音频源送指定AUX1辅助输出设备
	pthread_mutex_t monitoring_mutex_aux1;
	DARRAY(struct audio_monitor *) monitors_aux1;  // 追加的监听设备monitor
	char *monitoring_device_name_aux1;	// 监听设备友好名
	char *monitoring_device_id_aux1;	// 监听设备ID(对应WINDOWS设备管理 详细信息中的 子代)
	//  end  add by $hawn 20201104 包含音频源送指定AUX1辅助输出设备
	///
};

向obs_source增加struct audio_monitor,如下:

struct obs_source {
....
	pthread_mutex_t audio_cb_mutex;			// 音频回调函数结构互斥量,用于保护audio_cb_list线程安全
	DARRAY(struct audio_cb_info) audio_cb_list;	// 音频回调函数(送声卡播出及参数)

	struct audio_monitor *monitor;
	enum obs_monitoring_type monitoring_type;

	///
	// start add by $hawn 追加AUX1辅助监听
	struct audio_monitor *aux1_monitor;	
	enum obs_monitoring_type aux1_monitoring_type;
	//  end  add by $hawn 追加AUX1辅助监听
	///
}

最后再配合修改上层UI,最后的效果如下:
在这里插入图片描述
通过设置不同的监听设备、监听设备/辅助1可以将OBS场景中的任意视频中的音频送到监听设备中。

libobs/audio-monitoring目录下对应的三个平台的音频处理子目录
修改后的libobs完整包下载地址:
https://download.csdn.net/download/unsee888/13092017

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值