当前位置:首页 期刊杂志

基于多线程的视频采集系统

时间:2024-09-03

重庆邮电大学光电工程学院 徐 贺 邓宇静

基于多线程的视频采集系统

重庆邮电大学光电工程学院 徐 贺 邓宇静

使用windows的多线程技术设计和实现了的视频采集系统,为了保证数据的实时性和完整性,在程序中加入了对数据的队列操作。实验证明该系统具有良好的灵活性、扩展性。

多线程;视频采集;视频编码

1 引言

在实时视频数据采集过程中,常常会有“响应慢、卡顿”等问题,影响用户体验及感受。“响应慢” 往往是因为系统中部分经常执行的业务如图像格式转换、视频编码占用了大量的硬件资源。为此本文采用基于多线程和队列的技术,从软件角度进行了优化,缩小了响应延迟,提高了用户体验。

2 基于多线程视频采集框架分析

在Windows操作系统下,每个线程被分配了不同的时间片,在某个时刻,CPU仅执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片的时间很短,所以对用户来说仿佛各个线程在计算机中时并行处理的一样[1]。为此,我们不采用阻塞式同步消息处理机制,而采用异步的消息处理机制,其具体工作示意图如下所示:

图1 多线程下视频采集系统示意图

其中,视频源包括摄像头、Windows桌面,也可扩展为本地文件。视频采集线程、视频编码线程一直在后台运行,线程数据交互采用队列的方式进行,为了避免多线程下数据错误造成程序死锁等现象,采用关键代码段进行数据保护,即使用临界区时,各个线程共享一个对象,无论哪个线程占用临界区对象时,都可以访问受保护的数据。而其他线程需要等待,直到一个线程释放了临界区,另一个线程才可以访问。

3 异步多线程视频采集模块设计与实现

3.1 异步多线程的优缺点

可以将采集、编码以及传输分成多个部分,每个部分仅处理当前任务,将暂时不需要处理的数据放入队列中,下一部分将从队列中进行读取数据,并不直接响应上次操作。所以可以充分的利用系统资源、有效的降低系统响应时间,提高系统的稳定性[2]。

与之对应的异步多线程在本系统也存在着些缺点,将一次任务分为多个步骤进行执行。用户仅能从最后步骤中判断结果是否正确。如果最后一个步骤中出现异常情况,就可能造成结果与期待结果不一致,所以采用异步多线程需要注意代码的稳定性。

3.2 线程间队列技术

队列是一种先入先出的线性表,在使用队列时我们需要根据音视频数据对队列进行格式封装[3]。使队列中,每个视频帧单独作为一个存储块,每个存储块包括数据大小、占用标志位等信息,当写入信息时,将数据保存到指定区域,并标志位置1,当读出消息后,清空指定区域数据,标志位置0。等待下次使用,如果队列大小不够,使用递归的方式自动扩展队列大小。其主要函数如下所示:(1)建立队列 CreateQueue();(2)从队列中写入数据 WriteToQueue();标志位置1;(3)从队列中读取数据 ReadFromQueue();标志位置0。

3.3 异步多线程下的功能实现

根据异步多线程和队列的特点。以视频为例,本文主要利用ffmpeg开源库进行采集视频数据,然后利用libx264进行编码,然后通过相关网络协议进行网络数据传输。

3.3.1 基于ffmpeg的视频采集的实现

由于在此编码器中,我们最终获取到到的视频分辨率为640*480,并且在使用libx264库进行编码时需要输入的数据为YUV420格式。而通过ffmpeg进行采集生成的数据一般为YUV422格式,所以要利用ffmpeg库函数sws_scale()进行图像尺寸和格式变化。

在使用sws_scale()函数之前,首先要对ffmpeg进行初始化,注册所有文件格式和编解码器,利用avformat_open_input()打开视频源,利用avformat_find_stream_info()查找到视频流,利用avcodec_decode_ video2()进行视频解码,最后在函数sws_scale()函数中使用双三次插值算法得到YUV420数据,并将数据写入到队列中。

3.3.2 基于libx264的视频编码的实现

再使用libx264编码器之前,首先要设置编码器的码率方式及大小、编码像素格式、利用zerolatency方式设置实时性、利用定时器设置帧率。其中码率采用恒定平均码率ABR的方式进行码率控制,它是CBR和VBR的一种折中优化方案。关键参数如下所示:

m_param.i_fps_num = 25;

m_param.i_fps_den = 1;

m_param.rc.i_bitrate = 330;

m_param.rc.i_rc_method = X264_RC_ABR;

打开编码器后,利用x264_encoder_encode()函数将一帧图像编码为h.264格式,并以结构体x264_nal_t的形式输出即可。

4 结语

本文详细介绍了基于多线程的音视频采集、编码传输的过程和实现方式。其中利用异步多线程有效的降低了系统响应时间,提高了视频转播过程中实时性的要求,同时节约了系统资源;最后利用相关网络协议进行视频网络传输,实验表明,本模块可以用于构建实时采集转播系统。

[1]常发亮,刘静.多线程下多媒体定时器在快速数据采集中的应用[J].计算机应用,2003,23(S1):177-178.

[2]周方.基于队列和多线程的异步消息处理[J].中国水运:理论版,2007,5(5):166-167.

[3]王孟禄,李浩,张镭.基于多线程和队列操作的TCM上位机系统设计[J].河南大学学报(自然版),2016,46(1):96-101.

徐贺【通讯作者】(1985—),男,黑龙江哈尔滨人,硕士,主要研究方向:流媒体及视频编解码。

邓宇静(1993—),女,重庆人,硕士,主要研究方向:流媒体及视频编解码。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!