周斌 李和
摘 ? 要:文章主要研究了視頻信號(hào)的采集與壓縮編碼,在分析了現(xiàn)有的視頻傳輸格式后,利用ARM Cortex A8為核心的嵌入式Linux系統(tǒng)對(duì)所采集的視頻信號(hào)以硬件編碼的方式實(shí)現(xiàn)H.264壓縮編碼,在保證視頻清晰度的同時(shí)完成視頻的壓縮并編碼,同時(shí),通過(guò)串口發(fā)送壓縮后視頻信息流。最后經(jīng)測(cè)試,壓縮編碼后的視頻傳輸穩(wěn)定,畫(huà)面清晰流暢。
關(guān)鍵詞:Linux;H.264;編碼
1 ? ?關(guān)鍵技術(shù)分析與選擇
1.1 ?嵌入式操作系統(tǒng)的選擇
一個(gè)合格的嵌入式操作系統(tǒng)選取應(yīng)該包含以下幾點(diǎn)要求:(1)穩(wěn)定性,在嵌入式運(yùn)行過(guò)程中需要滿(mǎn)足全天候不間斷工作,這就對(duì)系統(tǒng)的穩(wěn)定性提出了較高的要求。作為運(yùn)行軟件的基礎(chǔ)平臺(tái),系統(tǒng)的穩(wěn)定運(yùn)行是第一要?jiǎng)?wù)。(2)可移植性,在現(xiàn)代社會(huì),市場(chǎng)上有大量的嵌入式設(shè)備可供選擇,有著完全不同的體系結(jié)構(gòu),為了降低程序的二次開(kāi)發(fā)難度,本次研究所選的操作系統(tǒng)應(yīng)該具備良好的代碼可移植性。
1.2 ?處理器的選擇
芯片集成度是否滿(mǎn)足要求,即處理器應(yīng)集成的控制器是否有適合項(xiàng)目的接口與控制設(shè)備,通常會(huì)選擇在完成任務(wù)的情況下選擇耗能較少的處理器。硬件成本合適,價(jià)格低廉性能優(yōu)良的處理器較為合適。
1.3 ?圖像壓縮編碼選擇的標(biāo)準(zhǔn)
常用的編碼格式有MPEG4,H.263,H.264,H.265,都能滿(mǎn)足要求。H.265是新的視頻編碼標(biāo)準(zhǔn),目前使用度并不高,主要因?yàn)樵谑褂秒y度上它的需求高。考慮到項(xiàng)目研究需求以及使用場(chǎng)合,主要是使用視頻壓縮編碼技術(shù),傳輸帶寬有一定的要求,綜上所述,MPEG4和H.264較為符合要求[1]。嵌入式系統(tǒng)CPU中包含使用硬件編碼的MFC模塊。但在同等的傳輸帶寬下,相比較下H.264比MPEG4有著更好的數(shù)字傳輸特性。
2 ? ?軟件設(shè)計(jì)與實(shí)現(xiàn)
2.1 ?系統(tǒng)軟件總體結(jié)構(gòu)
一個(gè)完整的嵌入式系統(tǒng)軟件需要滿(mǎn)足:含有應(yīng)用程序庫(kù)、操作系統(tǒng)、以及驅(qū)動(dòng)系統(tǒng)。(1)內(nèi)核版本,本次研究考慮到系統(tǒng)的完整性、穩(wěn)定性等一系列要求,認(rèn)為3.0.8內(nèi)核版本較為合適。由于系統(tǒng)需要更小的體積以及更高的傳輸效率,所以在操作過(guò)程中盡量降低內(nèi)核體積,在通過(guò)使用嵌入式開(kāi)發(fā)環(huán)境進(jìn)行編譯,在生成最新的內(nèi)核映像文件后,使用SD卡燒寫(xiě)用于操作系統(tǒng)內(nèi)核的安裝。(2)設(shè)備驅(qū)動(dòng),Linux操作系統(tǒng)作為驅(qū)動(dòng)以及硬件的操作系統(tǒng),系統(tǒng)驅(qū)動(dòng)程序上需要檢查主要包括USB/UART芯片CH340驅(qū)動(dòng)、硬件編碼器MFC驅(qū)動(dòng)等。(3)應(yīng)用程序,系統(tǒng)應(yīng)用程序中含有視頻采集模塊以及視頻壓縮轉(zhuǎn)換模塊,USB/UART模塊。(4)庫(kù)在嵌入式系統(tǒng),其使用編譯代表了資源的多少,在這個(gè)過(guò)程中會(huì)需要使用到很多的庫(kù)用于進(jìn)行編譯碼的運(yùn)行處理[2]。系統(tǒng)框架如圖1所示。
2.2 ?視頻采集模塊
在嵌入式視頻采集方案中最通用的協(xié)議是V4L2,它是V4L的改進(jìn)版,在Linux2.5.x中就被加入到Linux內(nèi)核中。另外,V4L2支持UVC免驅(qū)設(shè)備,省去了USB攝像頭驅(qū)動(dòng)移植的困難,極大地方便了視頻采集模塊的開(kāi)發(fā)。在研究中采用羅技C270攝像頭來(lái)開(kāi)發(fā)視頻采集應(yīng)用,開(kāi)發(fā)板Tiny210,當(dāng)USB攝像頭連接后,Linux會(huì)在/dev目錄下創(chuàng)建USB攝像頭操作接口Video3。使用V4L2的視頻采集后,就能通過(guò)使用內(nèi)存映射的方式將USB攝像頭采集到的數(shù)據(jù)映射到可操作的用戶(hù)空間。這里調(diào)用線(xiàn)程實(shí)現(xiàn)重復(fù)采集數(shù)據(jù)并保存在mmap映射內(nèi)存中,方便下一步調(diào)用顯示函數(shù)和H.264編碼函數(shù)[3]。在視頻采集中的重要步驟如下:
使用open(“/dev/video3”,O_RDWR | O_NONBLOCK)函數(shù)通過(guò)非阻塞的方式打開(kāi)USB攝像頭/dev下的video3驅(qū)動(dòng)。使用ioctl(cam_fd,VIDIOC_ENUM_FMT,&fmt)枚舉視頻設(shè)置支持的格式,ioctl(cam_fd,VIDIOC_QUERYCAP,&cap)查詢(xún)視頻設(shè)備支持的功能。這里將攝像頭參數(shù)打印出來(lái),可知USB攝像頭支持的視頻采集格式為YUYV。設(shè)置攝像頭采集參數(shù)ioctl(cam_fd,VIDIOC_S_FMT,&stream_fmt)。結(jié)構(gòu)體stream_fmt參數(shù)如下:
stream_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
stream_fmt.fmt.pix.width =320;
stream_fmt.fmt.pix.height =240;
stream_fmt.fmt.pix.pixelformat = PIXELFMT;
stream_fmt.fmt.pix.field= V4L2_FIELD_INTERLACED;
初始化完成后用ioctl(cam_fd,VIDIOC_QUERYBUF,&buf)將申請(qǐng)到的buf地址放入視頻采集緩存中使用,用于存儲(chǔ)視頻數(shù)據(jù)。調(diào)用ioctl(cam_fd,VIDIOC_STREAMON,&type)函數(shù),開(kāi)始進(jìn)行采集圖像工作。
從buf地址中獲取圖像并復(fù)制給新的存儲(chǔ)地址,把buf重新歸隊(duì)繼續(xù)采集圖像數(shù)據(jù)形成循環(huán)采集獲取到視頻流。當(dāng)需要停止時(shí)使用ioctl(cam_fd,VIDIOC_STREAMOFF,&type)停止視頻采集。并且使用unmap()函數(shù)釋放被占用的視頻緩存區(qū)buf。再關(guān)閉驅(qū)動(dòng)文件close(cam_fd)就可以停止視頻采集。
2.3 ?視頻壓縮程序設(shè)計(jì)
(1)通過(guò)函數(shù)打開(kāi)MFC硬件編碼設(shè)備:
SsbSipMfcEncOpen(&buf_type)。
(2)初始化編碼器對(duì)編碼結(jié)構(gòu)體SSBSIP_MFC_ENC_H264_PARAM進(jìn)行必要的參數(shù)設(shè)置。如采用什么編碼類(lèi)型、編碼圖像的高度和寬度、比特率、量化參數(shù)和幀率等選項(xiàng)進(jìn)行設(shè)置。主要地配置如下:
err=SsbSipMfcEncInit(openHandle, param);
param->codecType = H264_ENC;
param->SourceWidth = CapWidth;
param->SourceHeight = CapHeight;
param->Bitrate = 30000;
param->FrameQp = 30;
param->FrameRate = 30。
(3)建立和獲取數(shù)據(jù)輸入的緩存地址:
err = SsbSipMfcEncGetInBuf(openHandle,&iinfo);
err = SsbSipMfcEncSetInBuf(openHandle,&iinfo)。
(4)調(diào)用編碼函數(shù)進(jìn)行H.264視頻壓縮編碼:
err = SsbSipMfcEncExe(openHandle)。
(5)建立和獲取編碼輸出的緩存地址:
SSBSIP_MFC_ENC_OUTPUT_INFO oinfo;
err=SsbSipMfcEncSetOutBuf(openHandle,phyOutbuf,virOutbuf,outbufSize);
err = SsbSipMfcEncGetOutBuf(openHandle,&oinfo)。
(6)編碼完成后,硬件編解碼器設(shè)備MFC:
err = SsbSipMfcEncClose(openHandle)。
3 ? ?系統(tǒng)嵌入式硬件平臺(tái)測(cè)試
采用“友善之臂”提供的Tiny210方案,可以外接7寸的液晶屏。開(kāi)機(jī)后正常運(yùn)行,進(jìn)入系統(tǒng)后運(yùn)行“友善之臂”提供的檢測(cè)軟件測(cè)試各種功能是否正常使用。使用串口轉(zhuǎn)USB模塊連接電腦后,可以通過(guò)PC機(jī)上的SecureCRT查看目錄文件是否被成功掛載。最后對(duì)硬件接口進(jìn)行功能測(cè)試,如進(jìn)到/dev下,觀察是否有ttyUSB0串口設(shè)備接口文件,如果沒(méi)有說(shuō)明串口接口電路有問(wèn)題,需重新檢查串口模塊是否能正常使用。
3.1 ?圖像采集和顯示功能驗(yàn)證
在驗(yàn)證初期,通過(guò)使用代碼編寫(xiě)圖片的采集截取一幀使視頻通過(guò)BMP格式保存圖片信息,驗(yàn)證V4L2可操作USB攝像頭。后續(xù)實(shí)現(xiàn)連續(xù)的圖像采集形成視頻流文件,通過(guò)fwrite保存視頻文件來(lái)實(shí)現(xiàn)在PC機(jī)上使用PotPlayer播放器播放視頻文件,分析播放效果,一步步完善代碼實(shí)現(xiàn)視頻的采集與播放功能。圖2為所采集圖像在7寸LCD液晶屏播放的效果,圖像清晰、畫(huà)面流暢、運(yùn)行穩(wěn)定。
3.2 ?圖像壓縮功能驗(yàn)證
圖像壓縮主要就是對(duì)視頻信號(hào)進(jìn)行H.264壓縮編碼[4],觀察壓縮后數(shù)據(jù)量與壓縮前數(shù)據(jù)量大小是否變化,將編碼后的H.264文件通過(guò)SD卡復(fù)制到電腦上,就能用具有解碼工具的軟件進(jìn)行播放,如H.264文件可以用PotPlayer軟件進(jìn)行播放,觀察播放效果,判斷是否編碼成功,并進(jìn)一步改善代碼,使得視頻壓縮比例可調(diào),以應(yīng)對(duì)不同帶寬需求的場(chǎng)景。圖2上方是未壓縮前的視頻圖像,下方是經(jīng)壓縮處理過(guò)的視頻圖像,對(duì)比兩張圖像可以看出經(jīng)壓縮處理的視頻圖像質(zhì)量很好,盡管清晰度有所下降但不影響觀看。
4 ? ?結(jié)語(yǔ)
通過(guò)研究基于ARM-Cortex A8的嵌入式Linux開(kāi)發(fā)平臺(tái)中關(guān)于視頻編碼設(shè)計(jì),主要完成了有關(guān)V4L2協(xié)議下的USB攝像頭的視頻采集,采用S5PV210上的MFC硬件編碼對(duì)視頻數(shù)據(jù)進(jìn)行H.264格式編碼,并使用串口進(jìn)行數(shù)據(jù)流發(fā)送,對(duì)后期無(wú)線(xiàn)數(shù)字調(diào)制傳輸具有較高的參考價(jià)值。
[參考文獻(xiàn)]
[1]李毓強(qiáng).基于H_264和流媒體的嵌入式多路網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].南京:南京郵電大學(xué),2016.
[2]姚莉,鄧丹君.基于A8的嵌入式Linux遠(yuǎn)程視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].物聯(lián)網(wǎng)技術(shù),2016(5):24-26.
[3]楊建國(guó),蔡立志,鄭紅.基于ARM的嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2018(10):31-33.
[4]吳大中,胡江浪.基于ARM的移動(dòng)視頻監(jiān)控系統(tǒng)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2016(4):123-127.
無(wú)線(xiàn)互聯(lián)科技2019年18期