重慶郵電大學光電工程學院 徐 賀 鄧宇靜
基于多線程的視頻采集系統
重慶郵電大學光電工程學院 徐 賀 鄧宇靜
使用windows的多線程技術設計和實現了的視頻采集系統,為了保證數據的實時性和完整性,在程序中加入了對數據的隊列操作。實驗證明該系統具有良好的靈活性、擴展性。
多線程;視頻采集;視頻編碼
在實時視頻數據采集過程中,常常會有“響應慢、卡頓”等問題,影響用戶體驗及感受。“響應慢” 往往是因為系統中部分經常執行的業務如圖像格式轉換、視頻編碼占用了大量的硬件資源。為此本文采用基于多線程和隊列的技術,從軟件角度進行了優化,縮小了響應延遲,提高了用戶體驗。
在Windows操作系統下,每個線程被分配了不同的時間片,在某個時刻,CPU僅執行一個時間片內的線程,多個時間片中的相應線程在CPU內輪流執行,由于每個時間片的時間很短,所以對用戶來說仿佛各個線程在計算機中時并行處理的一樣[1]。為此,我們不采用阻塞式同步消息處理機制,而采用異步的消息處理機制,其具體工作示意圖如下所示:

圖1 多線程下視頻采集系統示意圖
其中,視頻源包括攝像頭、Windows桌面,也可擴展為本地文件。視頻采集線程、視頻編碼線程一直在后臺運行,線程數據交互采用隊列的方式進行,為了避免多線程下數據錯誤造成程序死鎖等現象,采用關鍵代碼段進行數據保護,即使用臨界區時,各個線程共享一個對象,無論哪個線程占用臨界區對象時,都可以訪問受保護的數據。而其他線程需要等待,直到一個線程釋放了臨界區,另一個線程才可以訪問。
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的形式輸出即可。
本文詳細介紹了基于多線程的音視頻采集、編碼傳輸的過程和實現方式。其中利用異步多線程有效的降低了系統響應時間,提高了視頻轉播過程中實時性的要求,同時節約了系統資源;最后利用相關網絡協議進行視頻網絡傳輸,實驗表明,本模塊可以用于構建實時采集轉播系統。
[1]常發亮,劉靜.多線程下多媒體定時器在快速數據采集中的應用[J].計算機應用,2003,23(S1):177-178.
[2]周方.基于隊列和多線程的異步消息處理[J].中國水運:理論版,2007,5(5):166-167.
[3]王孟祿,李浩,張鐳.基于多線程和隊列操作的TCM上位機系統設計[J].河南大學學報(自然版),2016,46(1):96-101.
徐賀【通訊作者】(1985—),男,黑龍江哈爾濱人,碩士,主要研究方向:流媒體及視頻編解碼。
鄧宇靜(1993—),女,重慶人,碩士,主要研究方向:流媒體及視頻編解碼。