林 峰,張 雷,梁明亮
(沈陽航空航天大學(xué) 電子信息工程學(xué)院,沈陽 110136)
第一版高效視頻編碼HEVC/H.265(High Efficiency Video Coding)標(biāo)準(zhǔn)于2013年發(fā)布。HEVC與H.264/AVC相比,在主觀性能上,即重建圖像在相同的主觀質(zhì)量下,HEVC的編碼碼率可以節(jié)省50%以上[1]。與H.264相比能夠減少50%的比特率主要是由于采用了更高級的編碼技術(shù),但這卻是以增加編碼復(fù)雜度和硬件設(shè)計(jì)難度為代價(jià)的[2]。目前許多硬件平臺(tái)都難以支持HEVC的實(shí)時(shí)編碼,這是制約HEVC應(yīng)用推廣的一個(gè)重要因素。本文以Jetson TX1嵌入式開發(fā)平臺(tái)為基礎(chǔ),設(shè)計(jì)實(shí)現(xiàn)了4K超高清分辨率(3840 x 2160)的實(shí)時(shí)HEVC編碼和傳輸系統(tǒng),并且在視頻質(zhì)量和實(shí)時(shí)性方面能夠滿足目前市場的應(yīng)用需求。網(wǎng)絡(luò)視頻的實(shí)時(shí)傳輸是網(wǎng)絡(luò)應(yīng)用的熱點(diǎn)之一,可以說是流媒體技術(shù)與視頻壓縮技術(shù)等多種技術(shù)的結(jié)合體[3]。因此本文設(shè)計(jì)的系統(tǒng)對于網(wǎng)絡(luò)視頻領(lǐng)域的發(fā)展有一定的借鑒意義。
Tegra X1是2015年NVIDIA公司推出的超級移動(dòng)芯片。Tegra X1搭載了四核的高性能64位ARM Cortex A57處理器和四核ARM Cortex A53(低功耗模式下),以及一顆具有256個(gè)CUDA核心的Maxwell架GPU。Maxwell架構(gòu)下SM中CUDA核心的工作效率比前代提高了40%,能耗高了一倍[4]。Tegra X1還集成了一個(gè)視頻編碼器硬核,能夠支持實(shí)時(shí)超高清視頻編解碼。其強(qiáng)大的性能和低功耗設(shè)計(jì)多用于基于嵌入式的計(jì)算機(jī)視覺、深度學(xué)習(xí)、多媒體和高性能計(jì)算等領(lǐng)域。
Jetson TX1是NVIDIA公司研發(fā)的一款嵌入式超級計(jì)算機(jī)模組,其處理器為Tegra X1,技術(shù)規(guī)格[5]如表1所示。
Jetson TX1的軟件平臺(tái)由引導(dǎo)程序、內(nèi)核、根文件系統(tǒng)和應(yīng)用軟件組成。Jetson TX1開發(fā)套件提供了一個(gè)稱為L4T的Linux環(huán)境,其中包括了許多通用的API和一些NVIDIA開發(fā)的工具,還包含了各種標(biāo)準(zhǔn)硬件接口,可以在包含高性能計(jì)算與低功耗的應(yīng)用場合下更方便靈活地進(jìn)行平臺(tái)擴(kuò)展和設(shè)計(jì)[6]。Jetson TX1的應(yīng)用軟件包括CUDA、cuDNN、TensorRT、VisionWorks、OpenCV4Tegra和Multimedia API等。
表1 Jetson TX1模塊技術(shù)規(guī)格
其中Multimedia API主要用于開發(fā)媒體應(yīng)用,與Gstreamer多媒體框架不同,這是一些更底層的接口,包含了用于相機(jī)開發(fā)的Argus API和主要用于視頻編碼、視頻解碼和視頻縮放等媒體應(yīng)用的V4L2 API,V4L2 API是根據(jù)Tegra X1處理器對通用的V4L2視頻框架進(jìn)行了擴(kuò)展。
利用NVIDIA公司提供的JetPack(Jetson SDK)搭建Jetson TX1的開發(fā)環(huán)境。本文所使用的開發(fā)環(huán)境為:PC機(jī)使用64位Ubuntu 14.04操作系統(tǒng),Jetson SDK的版本為JetPack 2.3。步驟如下。
第一步:在Ubuntu主機(jī)端運(yùn)行JetPack 2.3。根據(jù)安裝界面提示選擇對應(yīng)選項(xiàng),然后等待下載完畢。
第二步:燒寫到Jetson TX1。將Jetson TX1與Ubuntu主機(jī)連接到同一路由器或交換機(jī),并將IP地址設(shè)在同一網(wǎng)段。當(dāng)Ubuntu主機(jī)連接到Jetson Tx1設(shè)備后,設(shè)置Jetson TX1為“Force USB Recovery Mode”。然后可以在Ubuntu主機(jī)端看到Jeston TX1的安裝信息。
第三步:檢驗(yàn)。在Jetson TX1設(shè)備端,輸入以下命令:“cd /home/ubuntu/NVIDIA_CUDA-8.0_Samples/bin/aarch64/linux/release;./deviceQuery”,如果在終端上打印出相應(yīng)的CUDA設(shè)備信息則表明Jetson TX1上的系統(tǒng)開發(fā)環(huán)境搭建成功。
本文利用Jetson TX1的板載CSI相機(jī)OV5693采集視頻后送往HEVC編碼器進(jìn)行壓縮,最后打包成RTP包傳輸?shù)街鳈C(jī)端進(jìn)行解碼播放。系統(tǒng)總體框圖如圖1所示,數(shù)據(jù)流如圖2所示。
圖1 系統(tǒng)總體框圖
如圖1所示,從相機(jī)獲取YUV420格式幀率為30的視頻數(shù)據(jù),送給Tegra X1的硬件HEVC編碼器將其壓縮為H265碼流,對編碼器的輸出碼流進(jìn)行RTP打包后通過UDP廣播發(fā)送,在PC端和Jetson TX1本地端接收和解碼。另外,為了對比Tegra X1上硬件編碼器與PC上x265編碼器的編碼性能,把從相機(jī)采集的YUV420視頻數(shù)據(jù)送給PC上x265視頻編碼器編碼。
圖2 系統(tǒng)數(shù)據(jù)流圖
圖2中,數(shù)據(jù)從Sensor送到VI(video input),然后VI將從CSI單元接收的數(shù)據(jù)送到Tegra X1的系統(tǒng)內(nèi)存,再送到V4L2 API進(jìn)行編碼,將編碼后的碼流進(jìn)行RTP打包然后采用UDP廣播發(fā)送,接收端從網(wǎng)口接收數(shù)據(jù)送給gstreamer進(jìn)行解碼并保存到文件中。另外,把采集到的原始視頻文件YUV file1送給PC上x265編碼器并生成H265碼流文件。
2.3.1 獲取視頻數(shù)據(jù)
獲取相機(jī)原始視頻數(shù)據(jù)可選擇基于V4L2、Gstreamer、Argus等框架。本文選擇利用Argus來獲取原始視頻數(shù)據(jù), Argus是一個(gè)從相機(jī)獲取圖像及相應(yīng)元數(shù)據(jù)的API,并且可以輸出EGLStream圖像數(shù)據(jù)或者DMA Buffer文件描述符,DMA Buffer可以看做一塊共享內(nèi)存。這使得OpenGL、CUDA、V4L2和Gstreamer等能夠直接處理而不需要做耗時(shí)的內(nèi)存復(fù)制操作,此外Argus還可以調(diào)用ISP(Image Signal Processing)進(jìn)行一些圖像去噪和邊緣增強(qiáng)等圖像后處理。目前Argus能夠支持Android和L4T等多個(gè)平臺(tái)。Argus其實(shí)是一個(gè)基于圖像捕獲的API,本文利用Argus捕獲視頻數(shù)據(jù)的流程圖如圖3所示。
圖3 Argus相機(jī)數(shù)據(jù)采集
如圖3所示,首先獲取相機(jī)設(shè)備。然后為相機(jī)設(shè)備創(chuàng)建會(huì)話對象來控制捕獲圖像數(shù)據(jù)等過程。接下來在當(dāng)前會(huì)話來創(chuàng)建輸出流對象,并設(shè)置像素格式和圖像分辨率,設(shè)置輸出緩存描述符dmabuf_fd送往HEVC編碼器的輸入端。最后,設(shè)置采集幀率為30,發(fā)出捕獲請求。此時(shí)相機(jī)就開始采集圖像數(shù)據(jù)并緩存到DMA Buffer。
2.3.2 HEVC編碼器配置
Tegra X1處理器內(nèi)嵌了一個(gè)硬件視頻編碼器,能夠支持分辨率為4K×2K 幀率為30的HEVC實(shí)時(shí)編碼。Tegra X1上的HEVC視頻編碼器只支持Mainprofile。
配置HEVC編碼器主要包括以下內(nèi)容:創(chuàng)建一個(gè)視頻編碼器對象;設(shè)置視頻編碼器capture plane格式;設(shè)置視頻編碼器output plane格式;設(shè)置其他編碼器參數(shù),如碼率、IDR間隔、幀率、量化參數(shù)范圍等;為capture plane準(zhǔn)備緩存buffer,設(shè)置capture plane緩存buffer出隊(duì)列的回調(diào)函數(shù);為output plane準(zhǔn)備緩存數(shù)據(jù)(Argus提供的dmabuf_fd)。HEVC編碼器軟件配置流程如圖4所示。
圖4 HEVC編碼器配置流程
(1)像素存儲(chǔ)格式
Tegra X1上像素存儲(chǔ)格式分為pitchlinear和blocklinear,其中blocklinear格式的數(shù)據(jù)CPU不能直接調(diào)用相關(guān)算法處理,必須使用VIC(Video Image Compositor)轉(zhuǎn)換為pitchlinear格式再處理。視頻編碼器的output plane使用存儲(chǔ)于DMA buffer的pitchlinear I420格式的視頻數(shù)據(jù)。視頻編碼器的capture plane輸出CPU buffer。
(2)存儲(chǔ)設(shè)計(jì)
視頻編碼器的輸入緩存output plane隊(duì)列長度為10,I /O方式設(shè)置為V4L2_MEMORY_DMABUF,可從DMA Buffer中直接獲取由Argus采集到的原始視頻數(shù)據(jù)而無需內(nèi)存復(fù)制操作。輸出緩存capture plane隊(duì)列長度設(shè)置為10,I /O方式設(shè)置為V4L2_MEMORY_MMAP,即內(nèi)存映射方式。必須將output plane的隊(duì)列操作和和capture plane的隊(duì)列操作放在不同的線程中執(zhí)行。
(3)編碼參數(shù)說明
碼率是視頻編碼器的一個(gè)重要參數(shù),反映了壓縮編碼后視頻文件的大小,也影響著編碼視頻畫面的質(zhì)量。通常碼率越大,包含的視頻信息越多,圖像畫面質(zhì)量也越高,但同時(shí)也使得壓縮效率降低,網(wǎng)絡(luò)傳輸帶寬占用增大。碼率控制在視頻應(yīng)用,特別是視頻實(shí)時(shí)通信應(yīng)用中扮演著重要的角色[7]。通過碼率控制,可以使得已編碼數(shù)據(jù)碼率滿足傳輸網(wǎng)絡(luò)或者存儲(chǔ)介質(zhì)的約束[8]。Tegra X1上硬件視頻編碼器的默認(rèn)碼率是4000kbps,碼率控制方式式有VBR(Variable Bitrate)和CBR(Constant Bitrate)兩種。
數(shù)據(jù)在量化過程中會(huì)引入量化誤差,量化參數(shù)QP(Quantization Parameter)決定了量化誤差的大小。QP越小量化誤差越小,越能保留原始數(shù)據(jù)信息。QP值會(huì)直接影響H265碼流的失真和比特率,因此為HEVC編碼器選擇合適的QP值十分重要[9]。在某些傳輸速率受限的應(yīng)用場合,需要靈活地控制量化參數(shù)使得編碼速率盡量接近給定速率[10]。Tegra X1上硬件視頻編碼器可以分別設(shè)置I幀、P幀和B幀的量化參數(shù)范圍。
Tegra X1 HEVC不僅支持B幀編碼,支持的參數(shù)設(shè)置還參考幀數(shù)量、虛擬緩存大小、ROI參數(shù)、IDR間隔、幀率、Force I-frame、Temporal Tradeoff levels等,可根據(jù)具體需求設(shè)置,本文采用默認(rèn)參數(shù)。
2.3.3 RTP封裝H265碼流
RTP協(xié)議(Real-time Transport Protocol)是為了支持網(wǎng)絡(luò)實(shí)時(shí)傳輸服務(wù)而制定的實(shí)時(shí)傳輸標(biāo)準(zhǔn),其設(shè)計(jì)的目的是提供實(shí)時(shí)多媒體數(shù)據(jù)傳輸中的時(shí)間戳信息以及各個(gè)數(shù)據(jù)的同步功能[11]。H265碼流由一系列NALU組成(Network Abstraction Layer Unit),每個(gè)NALU的結(jié)構(gòu)由起始碼、NALU header和NALU payload組成。封裝成RTP包后的單元結(jié)構(gòu)為RTP header、NALU header和NALU payload。
RTP封裝H265碼流的模式分為三種,即單一NALU模式、組合封裝模式和分片封裝模式。鏈路層的載荷數(shù)據(jù)有MTU(Maximum Transmission Unit)大小限制,超過限制無法傳輸,按照以太網(wǎng)的一般限制,RTP包大小不能超過1472字節(jié)[12]。當(dāng)NALU的長度小于最大RTP包長度時(shí),采用一個(gè)NALU對應(yīng)一個(gè)RTP數(shù)據(jù)包的封裝方式,即單一NALU模式。如果NALU特別小,那就可以采取將幾個(gè)NALU封裝在一個(gè)RTP數(shù)據(jù)包中,即組合封裝模式。當(dāng)NALU的長度大于最大RTP包長度時(shí),就得采用分片封裝模式FUs(Fragmentation Units)。
2.3.4 Gstreamer解碼播放
Gstreamer是一個(gè)創(chuàng)建流媒體應(yīng)用的交叉平臺(tái)框架,Gstreamer通過把一些插件連接到一個(gè)定義了數(shù)據(jù)流的管道里來處理媒體流(主要是視頻和音頻)[13]。本文選擇基于Gstreamer來開發(fā)接收、解碼、播放程序。Gstreamer是基于插件的,具有任何符合規(guī)范的插件都可以方便地插入已定義的數(shù)據(jù)流管道的優(yōu)點(diǎn),因此,可以簡化媒體播放器的開發(fā)流程以提高可移植性[14]。
Gstreamer程序從網(wǎng)口接收RTP數(shù)據(jù)包,再將接收到的RTP數(shù)據(jù)包送到HEVC解碼器進(jìn)行軟件解碼后播放顯示。程序的pipeline設(shè)計(jì)如圖5所示,每個(gè)方框代表一個(gè)element。udpsrc實(shí)現(xiàn)從網(wǎng)口接收RTP數(shù)據(jù)包。然后通過rtph265depay對RTP數(shù)據(jù)解包,經(jīng)過解包后的數(shù)據(jù)為H265原始碼流。利用h265parse對碼流進(jìn)行分析,然后送往隊(duì)列緩存準(zhǔn)備解碼。再將H265原始碼流送給avdec_h265進(jìn)行解碼。最后,將解碼后的視頻數(shù)據(jù)送到xvimagesink實(shí)現(xiàn)視頻播放。
圖5 Gstreamer pipeline設(shè)計(jì)
根據(jù)本文設(shè)計(jì)的系統(tǒng),對HEVC編碼器在不同分辨率情況下的編碼速度、壓縮率和網(wǎng)絡(luò)發(fā)送速率進(jìn)行了測試,選擇的測試視頻是來自幀率為30的攝像頭ov5693實(shí)時(shí)采集,分辨率分別為640×480、1280×720、1920×1080、2104×1560、2592×1944、2616×1472和3840×2160。視頻編碼器碼率設(shè)置為4 000 kbps,碼率控制模式為CBR。在Tegra X1上編碼器參數(shù)如表2所示。將同樣的視頻YUV文件通過PC(CPU型號為Intel酷睿i53230M)上x265軟件編碼器編碼,得到的視頻編碼器參數(shù)如表3所示。視頻畫面質(zhì)量優(yōu)良,其中1920×1080分辨率視頻畫面如圖6所示,圖中左下角為Jetson TX1開發(fā)組件。
表2中壓縮比是用壓縮后H265文件大小與原始視頻YUV文件大小之比。編碼速率是指視頻編碼器單位時(shí)間內(nèi)能夠壓縮視頻編碼的視頻幀數(shù),用單位fps表示[15];UDP傳輸時(shí)間是指一幀視頻數(shù)據(jù)從HEVC編碼器輸出后,對視頻幀數(shù)據(jù)進(jìn)行RTP打包和UDP發(fā)送完畢所消耗的時(shí)間,再通過發(fā)送每幀視頻數(shù)據(jù)需要的平均時(shí)間計(jì)算得到UDP傳輸速率;系統(tǒng)輸出時(shí)間是指將采集到的一幀視頻數(shù)據(jù)進(jìn)行編碼和發(fā)送出去所消耗的時(shí)間,通過平均系統(tǒng)輸出時(shí)間計(jì)算得到系統(tǒng)輸出速率。峰值信噪比PSNR按如下公式計(jì)算:
圖6 視頻畫面
表2 TegraX1系統(tǒng)測試數(shù)據(jù)
分析表2數(shù)據(jù),可以發(fā)現(xiàn)本文設(shè)計(jì)的HEVC編碼傳輸系統(tǒng)能夠支持4K分辨率(3840×2160)的實(shí)時(shí)編碼和傳輸。
表3 PC端x265編碼性能參數(shù)
對比表2與表3中的數(shù)據(jù),發(fā)現(xiàn)在壓縮率比相同的情況下,與PC上x265編碼器相比,Tegra X1上的硬件視頻編碼器的編碼速率高2個(gè)數(shù)量級,PSNR高4dB。
本文在NVIDIA Jetson TX1平臺(tái)設(shè)計(jì)實(shí)現(xiàn)一種HEVC實(shí)時(shí)編碼傳輸系統(tǒng),該系統(tǒng)利用NVIDIA公司提供的Multimedia API進(jìn)行了攝像頭視頻采集和HEVC編碼,對HEVC的輸出碼流進(jìn)行RTP封裝后通過UDP廣播發(fā)送,最后在PC端和Jetson TX1平臺(tái)上接收解碼。測試結(jié)果表明,實(shí)現(xiàn)同等壓縮比條件下,Tegra X1的硬件視頻編碼器編碼速率比PC(Intel酷睿i5 3230M)上x265的編碼速率高2個(gè)數(shù)量級,PSNR比PC上x265高4dB。本文設(shè)計(jì)的系統(tǒng)在保證視頻畫面質(zhì)量良好的情況下能夠達(dá)到4K分辨率的實(shí)時(shí)編碼傳輸。