殷軼鳴
摘要:文章詳細論述了熱線錄音系統的架構設計及業務流程。該系統改進了之前的工作流程,解決了長期以來各個直播室分開錄音,且需要在錄音時人工干預的情況。之后介紹了熱線錄音服務器和錄音軟件的情況,最后對錄音系統的使用情況和未來發展進行了展望。
關鍵詞:直播室熱線 錄音系統 Linux系統
近年來上海臺及一些外地臺上線使用了基于Telos Hx6新一代電話耦合器的熱線系統。新耦合器在支持傳統硬件接聽撥打熱線電話的同時還開放了電話控制器協議,我們基于此協議設計并實現了運用客戶端軟件來進行接聽撥打熱線電話,這個客戶端軟件大大擴展了傳統熱線系統功能。
隨著新一代熱線電話系統投入使用,用戶對熱線系統錄音也有了新的要求。之前的熱線錄音往往布置在各個直播室并且彼此相互獨立,這對系統的維護和管理不利。錄音時導播需要打開錄音軟件手動控制錄音過程,操作也不方便。為此我們提出一種新的直播室熱線錄音系統,將原先各個直播實的錄音系統歸并到一個系統部署在一臺設備上。系統分為錄音服務器和錄音程序兩部分,錄音服務器最多支持32路電話錄音,配有2T硬盤存儲錄音文件。錄音服務器安裝Linux操作系統,錄音程序基于Linux系統使用C語言編寫。錄音文件生成后存放在指定的文件夾下,使用Linux系統的Samba服務供用戶訪問。
系統的架構設計
以往熱線電話錄音是在直播室進行電話線分線,一路接電話耦合器,另一路接裝有錄音程序的工作站。當導播需要錄音時,打開錄音軟件進行錄音,錄音文件保存在這臺工作站上。我們希望電話錄音這一過程能夠自動進行不需要人工干預,所有直播室的錄音在一臺服務器上進行,錄音文件保存在服務器上,用戶通過訪問服務器訪問錄音文件。經過設計熱線錄音系統的整體拓撲如圖1所示。
直播室熱線電話由電信運營商提供并接入物業電話機房,我們設計將物業電話線架上的電話線一分二,一路接入直播室,另一路接入數控機房,通過轉換器將電話線接入錄音服務器。錄音服務器部署在數控機房內網,與用戶分離,確保了服務器的安全性和運維人員維護的便利性。錄音服務器通過內網交換機經防火墻與辦公網連接,使得直播室熱線電話客戶端可以與錄音服務器相互訪問。
我們希望錄音能由程序自動執行。錄音程序偵測到聽眾來電后不立即錄音,等待導播拿起電話后才進行錄音。導播通話結束后錄音程序終止錄音過程,保存錄音文件。系統流程圖如圖2所示:
錄音卡會實時讀取每條熱線電話的狀態,熱線有以下五種狀態:0為空閑,1為振鈴,2為接起,3為撥打電話,4為掛斷。在每個直播室有一臺熱線客戶端裝有該直播室的熱線數據庫,記錄該直播室每條熱線電話的當前狀態和接聽記錄。錄音程序會實時將錄音卡讀到的熱線狀態寫入數據庫。當讀到導播接起聽電話的狀態后,錄音程序調用錄音卡開始錄音并生成文件。當導播掛斷電話,錄音程序終止錄音,將錄音文件保存在指定的文件目錄下。
錄音服務器
錄音服務器為一臺1U設備,分為左右兩部分。左半邊安裝服務器主板和硬盤存儲,安裝有Linux操作系統,錄音程序就部署在該系統上,我們將程序設置為開機自啟動。操作系統我們選用CentOS 6.2,CentOS是Linux發行版本之一,它由來自于Red Hat Enterprise Linux提供的可自由使用源代碼所編譯而成,是一個企業級Linux發行版本。服務器配有一塊2T容量的硬盤存儲錄音文件,電話錄音文件通常采樣率不高,所以存儲空間基本能滿足用戶需求。
右半邊插有兩塊各16路的電話錄音卡,系統最多支持32路電話錄音,錄音卡后接有模擬電話線轉接的轉換器。系統使用前需要安裝錄音卡驅動并進行相關配置。錄音卡廠家提供的驅動目下ShConfig.ini文件是錄音卡驅動的配置文件,可直接通過系統自帶的Vi編輯器配置或者在CentOS圖形界面下通過ShCticonfig程序來配置。通常需要配置TotalBoards和TotalAppCh兩個參數,前者表示錄音板卡數量,后者表示錄音通道數。此外驅動目錄下還提供了Test_gtk程序,在圖形界面下運行這個程序,可以測試外卡接線路的狀態。
服務器還需要安裝mysql客戶端,因為錄音程序需要連接導播室熱線客戶端電腦的mysql數據庫。對于用戶訪問錄音文件,我們使用了CentOS上自帶的Samba共享服務。Samba是在Linux系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。SMB協議是一種在局域網上共享文件和打印機的一種通信協議,它為局域網內的不同計算機之間提供文件及打印機等資源的共享服務。
錄音程序和配置
錄音程序用C語言編寫,主要通過調用錄音卡的接口程序來實現錄音功能。由于錄音程序需要控制所有直播室的熱線錄音以及將錄音文件保存在不同的文件夾下,所以必須讓程序知道每個直播室線路的分布狀況以及不同錄音文件存儲路徑。為此在錄音程序目錄設置有一個config.ini的配置文件,此文件寫有所有直播室熱線電話的情況和熱線數據庫的信息。這里以兩個頻率為例,配置文件結構和注釋如下:
[init]
recisdo=1 //錄音標志 1為錄音,0為關閉。
maxtimes=3 //設置振鈴三秒,等待導播接起電話
rectype=0
mysqlcount=2 //配置連接數據庫數量,也就是頻率的數量。
[mysql] //數據庫配置
ip0= //數據庫地址,應該填寫頻率0熱線主機的ip0地址
username0= //數據庫用戶名,
password0= //數據庫密碼,
dbname0= //數據庫名稱,
ip1= //數據庫地址,應該填寫頻率1熱線主機的ip1地址
username1= //數據庫用戶名,
password1= //數據庫密碼,
dbname1= //數據庫名稱,
[channel] //配置頻率信息
mysql0=0 //第0號對應mysql配置中ip0的數據庫
linenum0=0 //錄音卡第0條線對應ip0數據庫所在頻率的電話耦合器的第0條線
recdir0= //頻率0錄音文件存儲位置
recdays0= //到期刪除設置
mysql1=0 //第1號對應mysql數據庫配置中ip0的數據庫
linenum1=1 //錄音卡第1條線對應ip0數據庫所在頻率的電話耦合器的第1條線
recdir1=
recdays1=60
錄音程序啟動后先初始化錄音板卡,再讀取config.ini文件,通過兩個函數分別從config.ini文件讀取字符串類型和整型類型數據。然后檢測各個直播室的熱線Mysql數據庫服務器是否能連接成功,如果連接不通,則不去連接mysql數據庫以防數據庫連接超時。錄音程序通過函數一直獲取錄音卡返回的各線路狀態,當偵測到有線路振鈴后,經過maxtimes等待,錄音程序通過調用函數在指定的路徑下生成錄音文件開始錄音,同時根據config.ini文件中的信息,拼出對應的文件名。文件名通常為線路號加上時間戳,以便于用戶查找。錄音程序循環(通常為2秒)會更新直播室的熱線Mysql數據庫中線路狀態。當導播掛斷電話后,錄音程序會將熱線狀態重置為空閑,等待該線路下一次來電。
錄音程序還設計了定期清除指定文件下文件的功能,以防止錄音文件過多導致磁盤空間不足。通過設置config.ini文件中recdays參數,程序會自動刪除指定路徑下recdays天前的文件。
總結與展望
采用上述系統后,我們將所有直播室的錄音工作整合到一臺服務器上,不僅不需要人工干預程序就可以自動執行,還有利于維護和管理。
在目前熱線錄音系統運行的基礎上,我們對系統的未來進行了展望。目前熱線電話的數據庫是分布獨立的,錄音程序需要將熱線電話的狀態分別寫入各個頻率的熱線數據庫。之后可以將各個頻率的數據庫合并成一個數據庫,這樣對維護和管理是有益的。
(作者單位:上海廣播電視臺)