首页 > 其他分享 >obs lib屏幕捕捉相关流程整理

obs lib屏幕捕捉相关流程整理

时间:2023-03-16 19:14:58浏览次数:33  
标签:info input lib frame mutex output video 屏幕 obs

切入点:

video_thread线程主循环,只要video->stop为false,会循环调用video_output_cur_frame来捕捉当前屏幕。

//碧麟标注裁剪版本
static void *video_thread(void *param)
{
	struct video_output *video = param;
    
    //设置线程名字
	os_set_thread_name("video-io: video thread");

	//线程主循环
	while (os_sem_wait(video->update_semaphore) == 0) {
		if (video->stop)
			break;

        //循环调用video_output_cur_frame获取当前屏幕
		while (!video->stop && !video_output_cur_frame(video)) {
			os_atomic_inc_long(&video->total_frames);
		}

	}

	return NULL;
}

这里用到video_output核心结构体 ,结构体定义如下

 

 

捕捉当前帧核心逻辑

//捕捉当前帧
static inline bool video_output_cur_frame(struct video_output *video)
{
    //帧信息
	struct cached_frame_info *frame_info;
	bool complete;
	bool skipped;

	/* -------------------------------- */

	pthread_mutex_lock(&video->data_mutex);

	frame_info = &video->cache[video->first_added];

	pthread_mutex_unlock(&video->data_mutex);

	/* -------------------------------- */

	pthread_mutex_lock(&video->input_mutex);

	for (size_t i = 0; i < video->inputs.num; i++) {
		struct video_input *input = video->inputs.array + i;
		struct video_data frame = frame_info->frame;

		if (scale_video_output(input, &frame))
			input->callback(input->param, &frame);
	}

	pthread_mutex_unlock(&video->input_mutex);

	/* -------------------------------- */

	pthread_mutex_lock(&video->data_mutex);

	frame_info->frame.timestamp += video->frame_time;
	complete = --frame_info->count == 0;
	skipped = frame_info->skipped > 0;

	if (complete) {
		if (++video->first_added == video->info.cache_size)
			video->first_added = 0;

		if (++video->available_frames == video->info.cache_size)
			video->last_added = video->first_added;
	} else if (skipped) {
		--frame_info->skipped;
		os_atomic_inc_long(&video->skipped_frames);
	}

	pthread_mutex_unlock(&video->data_mutex);

	/* -------------------------------- */

	return complete;
}

 

标签:info,input,lib,frame,mutex,output,video,屏幕,obs
From: https://www.cnblogs.com/billin/p/17223814.html

相关文章

  • pyinstaller 打包报错Failed to determine matplotlib‘s data directory
    #fromPyInstaller.utils.hooksimportexec_statement##mpl_data_dir=exec_statement(#"importmatplotlib;print(matplotlib.get_data_path())")#assert......
  • 如何更改Dolibarr服务的默认端口号
    Dolibarr是一个ERP管理系统软件。默认是80端口,如果需要改成其它端口,如8080,那么:1.修改apache2的两个配置文件:/etc/apache2/ports.conf,  /etc/apache2/sites-enabled/0......
  • obs录屏核心流程分析
    从output入手,梳理一下obsoutput的结构。这里需要仔细过一遍,因为接下来需要把视频写入Unreal的Rendertarget对象,来渲染成材质。音频也需要单独接入到Unreal引擎中。梳理的......
  • SUSE SLES12 Security Update: libtasn1 Vulnerability_Day 10
    今天要跟大家分享的是关于SUSELinux的系统缺陷。这是一个远程SuseLinux主机缺少安全补丁的更新。下面是关于这个问题的具体的描述:TheremoteSUSELinuxSLES12hosthas......
  • Libcsv库解析csv格式文件
    一、问题引入数据通信和数据存储的格式是多种多样的,不同的人会选择不同的数据格式,这就涉及数据格式的转换。csv格式的文件在数据通信和存储使用较多,有必要记录一下csv格......
  • cannot access class org.springframework.cglib.core.ReflectUtils with java 17
    (inmodulecom.xxx)cannotaccessclassorg.springframework.cglib.core.ReflectUtils(inunnamedmodule@0x2d950574)becausemodulecom.xxxdoesnotreadunname......
  • SpringCloud Alibaba Nacos 简介
    Nocos(DynamicNamingandConfigurationService)一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。可以说Nacos是注册中心和配置中心的组合。Nacos官网;h......
  • SpringCloud Alibaba 入门简介
    为什么会出现SpringCloudAlibaba?因为SpringCloudNetflix项目进入维护模式。维护模式:意味着SpringCloud团队将不会再向模块添加新功能。将修复block级别的bug以......
  • importlib 用法
    首先看一下importlib.import_module(name,package=None)函数的参数函数调用存在两种方式:1.绝对导入,name为完整路径str,package为None。2.相对导入,package需指定对应包......
  • libunwind安装问题
    一、unknowntypename'pthread_mutex_t'在dwarf.h添加头文件二、multipledefinitionof`_U_dyn_info_list'gcc版本太新,可以降版本,也可以在configure添加-fcommon编......