本文來(lái)源電子發(fā)燒友社區(qū),作者:ALSET, 帖子地址:https://bbs.elecfans.com/jishu_2304469_1_1.html
直播編碼網(wǎng)咯推流開(kāi)發(fā)測(cè)試
飛凌RZ/G2L的開(kāi)發(fā)板試用測(cè)評(píng)報(bào)告三--實(shí)時(shí)視頻編碼推流設(shè)計(jì)與實(shí)現(xiàn)
大信(QQ:8125036)
在前面的試用測(cè)試基礎(chǔ)上,逐漸熟悉了RZ/G2L開(kāi)發(fā)板的SDK,在研究過(guò)它的音視頻硬件與軟件包后,在想進(jìn)一步利用該開(kāi)發(fā)板做音視頻的深度的應(yīng)用開(kāi)發(fā)。前面已經(jīng)實(shí)現(xiàn)了在開(kāi)飯上采集視頻,采集視頻是視頻開(kāi)發(fā)的基礎(chǔ),基本熟悉了板子支持V4L2軟件工具,其實(shí)V4l2還能做很多其它的功能。同樣還有很多其它的音視頻軟件也有很強(qiáng)大的功能,比如ffmpeg ,GStream,VLC等開(kāi)源的軟件庫(kù)等。 在本次試用中嘗試將這些軟件移植到該平臺(tái)上,以便發(fā)揮該平臺(tái)硬件的優(yōu)勢(shì)性能。這里就結(jié)合該開(kāi)發(fā)板的音視頻功能進(jìn)一步進(jìn)行音視頻高級(jí)功能進(jìn)行開(kāi)發(fā)與測(cè)試。
![pYYBAGMQ1UOAfzUxABBRXaQAX8Q964.png](https://file.elecfans.com/web2/M00/67/1D/pYYBAGMQ1UOAfzUxABBRXaQAX8Q964.png)
圖1
一、實(shí)時(shí)視頻編碼推流整體設(shè)計(jì)為了完成在RZ/G2L板上的實(shí)時(shí)視頻采集編碼與網(wǎng)絡(luò)發(fā)送,需要整體的做設(shè)計(jì),設(shè)計(jì)確定好整體測(cè)試的通信協(xié)議,以及配合測(cè)試的方式。
實(shí)時(shí)視頻網(wǎng)絡(luò)推流,是指的是把采集階段封包好的內(nèi)容傳輸?shù)椒?wù)器的過(guò)程。主流的推送協(xié)議和優(yōu)缺點(diǎn)有:
RTMP是Realtime Messaging Protocol(實(shí)時(shí)消息傳輸協(xié)議)的縮寫(xiě),是Adobe公司為Flash/AIR平臺(tái)和服務(wù)器之間音、視頻及數(shù)據(jù)傳輸開(kāi)發(fā)的實(shí)時(shí)消息傳送協(xié)議。RTMP協(xié)議基于TCP,包括RTMP基本協(xié)議及RTMPT/RTMPS/RTMPE等多種變種。
RTMP協(xié)議中,視頻必須是H264編碼,音頻必須是AAC或MP3編碼,且多以flv格式封包。RTMP是目前最主流的流媒體傳輸協(xié)議,對(duì)CDN支持良好,實(shí)現(xiàn)難度較低,是大多數(shù)的直播平臺(tái)的選擇。
不過(guò)RTMP有著一個(gè)最大的不足——不支持瀏覽器,且Adobe已不再更新。因此直播服務(wù)要支持瀏覽器的話,需要另外的推送協(xié)議支持。
Http Live Streaming是由Apple公司定義的基于HTTP的流媒體實(shí)時(shí)傳輸協(xié)議。它的原理是將整個(gè)流分為多個(gè)小的文件來(lái)下載,每次只下載若干個(gè)。服務(wù)器端會(huì)將最新的直播數(shù)據(jù)生成新的小文件,客戶(hù)端只要不停的按順序播放從服務(wù)器獲取到的文件,就實(shí)現(xiàn)了直播?;旧希琀LS是以點(diǎn)播的技術(shù)實(shí)現(xiàn)了直播的體驗(yàn)。因?yàn)槊總€(gè)小文件的時(shí)長(zhǎng)很短,客戶(hù)端可以很快地切換碼率,以適應(yīng)不同帶寬條件下的播放。
分段推送的技術(shù)特點(diǎn),決定了HLS的延遲一般會(huì)高于普通的流媒體直播協(xié)議。
傳輸內(nèi)容包括兩部分:一是M3U8描述文件,二是TS媒體文件。TS媒體文件中的視頻必須是H264編碼,音頻必須是AAC或MP3編碼。
由于數(shù)據(jù)通過(guò)HTTP協(xié)議傳輸,所以完全不用考慮防火墻或者代理的問(wèn)題,而且分段文件的時(shí)長(zhǎng)很短。
WebRTC(Web Real-Time Communication),即“源自網(wǎng)頁(yè)即時(shí)通信”。WebRTC是一個(gè)支持瀏覽器進(jìn)行實(shí)時(shí)語(yǔ)音、視頻對(duì)話的開(kāi)源協(xié)議。WebRTC的支持者甚多,Google、Mozilla、Opera推動(dòng)其成為W3C推薦標(biāo)準(zhǔn)。
WebRTC支持目前的主流瀏覽器,并且基于SRTP和UDP,即便在網(wǎng)絡(luò)信號(hào)一般的情況下也具備較好的穩(wěn)定性。
此外,WebRTC可以實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信,通信雙方延時(shí)低,此外,WebRTC可以實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信,通信雙方延時(shí)低,是實(shí)現(xiàn)“連麥”功能比較好的選擇。
UDP方式推流,有些直播應(yīng)用會(huì)使用 UDP 做為底層協(xié)議開(kāi)發(fā)自己的私有協(xié)議,因?yàn)?UDP 在弱網(wǎng)環(huán)境下的優(yōu)勢(shì)通過(guò)一些定制化的調(diào)優(yōu)可以達(dá)到比較好的弱網(wǎng)優(yōu)化效果,但同樣因?yàn)槭撬接袇f(xié)議也勢(shì)必與其它系統(tǒng)互聯(lián)互通有一定問(wèn)題。
它的優(yōu)點(diǎn)是,協(xié)議簡(jiǎn)單能夠進(jìn)行定制化優(yōu)化,能夠在網(wǎng)內(nèi)進(jìn)行視頻流組播,為后續(xù)視頻濾鏡,特效開(kāi)發(fā)形成網(wǎng)絡(luò)分布式的工作環(huán)境,又開(kāi)發(fā)方便,視頻傳輸延時(shí)低。能夠較快的實(shí)現(xiàn)那一套視頻實(shí)時(shí)系統(tǒng)。缺點(diǎn)就是只能在局域網(wǎng)傳輸,無(wú)法把視頻流發(fā)布到互聯(lián)網(wǎng)上。
但此次主要目的為了測(cè)試開(kāi)發(fā)板的編碼與網(wǎng)絡(luò)實(shí)時(shí)傳輸?shù)男阅埽虼吮敬畏桨高x擇了UDP的技術(shù)方案。
本次實(shí)驗(yàn)的運(yùn)行結(jié)構(gòu)模式如下圖:
![pYYBAGMYZiSAK5g1AABa6LUaFz8000.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZiSAK5g1AABa6LUaFz8000.png)
圖2
整體分為視頻推流端,即在開(kāi)發(fā)板完成視頻采集,編碼和UDP發(fā)送視頻流數(shù)據(jù)。在視頻流發(fā)送端軟件設(shè)計(jì)如下,主要設(shè)計(jì)為多線程方式,分為三個(gè)線程,分別完成視頻采集工作,視頻編碼工作,網(wǎng)絡(luò)通訊工作,三個(gè)線程通過(guò)內(nèi)存隊(duì)列塊進(jìn)行數(shù)據(jù)的轉(zhuǎn)移和存儲(chǔ)。這些模塊總體運(yùn)行的設(shè)計(jì)時(shí)序如下圖:![poYBAGMYZiWAVY1TAAC2g7IvHvs391.png](https://file.elecfans.com/web2/M00/67/80/poYBAGMYZiWAVY1TAAC2g7IvHvs391.png)
圖3
接收端,即在Ubuntu上實(shí)現(xiàn)UDP數(shù)據(jù)包接收,解碼還原成視頻幀并顯示到窗口上的過(guò)程。視頻接收方設(shè)計(jì)為兩個(gè)工作線程,一個(gè)數(shù)據(jù)隊(duì)列,其中一個(gè)線程完成數(shù)據(jù)的接受,因?yàn)椴捎肬DP的協(xié)議,這里接收方設(shè)計(jì)為先啟動(dòng),開(kāi)發(fā)監(jiān)聽(tīng)端口等待UDP數(shù)據(jù)包,接收到數(shù)據(jù)包后,解包,把數(shù)據(jù)包再放入接收隊(duì)列中。另外一個(gè)線程完成從隊(duì)列里獲取解包后的H264數(shù)據(jù),進(jìn)行解碼,生成圖像幀內(nèi)容,然后形成內(nèi)存圖片,然后刷新到UI主線程界面中去,接收端模塊設(shè)計(jì)工作調(diào)用和時(shí)序如下圖所示:![pYYBAGMYZiaAQ6e-AACW7QYEbqU182.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZiaAQ6e-AACW7QYEbqU182.png)
圖4
有了整體的設(shè)計(jì)后,就可以開(kāi)始開(kāi)發(fā)板上運(yùn)行的發(fā)送端以及Ubuntu上的接收播放端軟件。二、V4l2視頻開(kāi)發(fā)介紹
在前一篇視頻采集的開(kāi)發(fā)里已經(jīng)用到了V4L2視頻框架,V4L2(Video for Linux2), 是一個(gè)專(zhuān)門(mén)為 linux 設(shè)備設(shè)計(jì)的視頻采集和視頻設(shè)備管理框架,是Linux下關(guān)于視頻采集相關(guān)設(shè)備的驅(qū)動(dòng)框架,為驅(qū)動(dòng)和應(yīng)用程序提供了一套統(tǒng)一的接口規(guī)范。它使應(yīng)用與硬件設(shè)備接口無(wú)關(guān),音視頻應(yīng)用不必關(guān)心底層硬件的差異與實(shí)現(xiàn)。在不同硬件平臺(tái)上,V4L2有自己的適配和支持。在RZ/G2L板上是實(shí)現(xiàn)了該視頻框架,這里先使用V4L2進(jìn)行一些測(cè)試與開(kāi)發(fā)。
![poYBAGMYZiaACZaNAAEsx4SIsAc148.png](https://file.elecfans.com/web2/M00/67/80/poYBAGMYZiaACZaNAAEsx4SIsAc148.png)
圖5
lVideo capture device :從攝像頭等設(shè)備上獲取視頻數(shù)據(jù)。video capture是V4L2的基本應(yīng)用。設(shè)備名稱(chēng)為/dev/video,主設(shè)備號(hào)81,子設(shè)備號(hào)0~63lVideo output device :將視頻數(shù)據(jù)編碼為模擬信號(hào)輸出。與video capture設(shè)備名相同。
lVideo overlay device :將同步鎖相視頻數(shù)據(jù)(如TV)轉(zhuǎn)換為VGA信號(hào),或者將抓取的視頻數(shù)據(jù)直接存放到視頻卡的顯存中。
lVideo output overlay device :也被稱(chēng)為OSD(On-Screen Display)
三、V4l2基本操作流程
lVBI device :提供對(duì)VBI(VerticalBlanking Interval)數(shù)據(jù)的控制,發(fā)送VBI數(shù)據(jù)或抓取VBI數(shù)據(jù)。設(shè)備名/dev/vbi0~vbi31,主設(shè)備號(hào)81,子設(shè)備號(hào)224~255
lRadio device :FM/AM發(fā)送和接收設(shè)備。設(shè)備名/dev/radio0~radio63,主設(shè)備號(hào)81,子設(shè)備號(hào)64~127
v4l2設(shè)備的基本操作流程如下
1、打開(kāi)設(shè)備,例如 fd =open("/dev/video0",0)
2、查詢(xún)?cè)O(shè)備能力. 如:
structcapability cap;
ioctl(fd,VIDIOC_QUERYCAP,&cap)
3、設(shè)置優(yōu)先級(jí)(可選)
4、配置設(shè)備. 包括:
視頻輸入源的視頻標(biāo)準(zhǔn),VIDIOC_*_STD
視頻數(shù)據(jù)的格式 , VIDIOC_*_FMT
視頻輸入端口, VIDIOC_*_INPUT
視頻輸出端口,VIDIOC_*_OUTPUT
5、啟動(dòng)設(shè)備開(kāi)始I/O操作。
V4L2支持一下三種I/O方式:
Read/Write:通過(guò)調(diào)用設(shè)備節(jié)點(diǎn)文件的Read/Write函數(shù),與設(shè)備交互數(shù)據(jù)。打開(kāi)設(shè)備后,默認(rèn)使用的是此方法。
StreamI/O:流操作,只傳遞數(shù)據(jù)緩沖區(qū)指針,不拷貝數(shù)據(jù)。使用此方法,需要調(diào)用VIDIOC_REQBUFS ioctl來(lái)通知設(shè)備。流操作I/O有兩種方式memory map和user buffer。(具體區(qū)別后面章節(jié)介紹)
overlay:也可以理解為memory tomemory 傳輸。將數(shù)據(jù)從內(nèi)存拷貝到顯存中。overlay設(shè)備獨(dú)有的。
對(duì)于Capture device可以以如下方式啟動(dòng)設(shè)備:
調(diào)用VIDIOC_REQBUFS ioctl來(lái)分配緩沖區(qū)隊(duì)列;
調(diào)用VIDIOC_STREAMON ioctl通知設(shè)備開(kāi)始stream IO
調(diào)用VIDIOC_QBUF ioctl從設(shè)備獲取一幀視頻數(shù)據(jù);
使用完數(shù)據(jù)后,調(diào)用VIDIOC_DQBUF將緩沖區(qū)還給設(shè)備,以便設(shè)備填充下一幀數(shù)據(jù)。
6、釋放資源并關(guān)閉設(shè)備。
![poYBAGMYZieAMLIyAAVAVHL-y6Y774.png](https://file.elecfans.com/web2/M00/67/80/poYBAGMYZieAMLIyAAVAVHL-y6Y774.png)
圖6
在Ubuntu下開(kāi)發(fā)代碼如下,主要完成了視頻流接收,解包,解碼最后送到 QT窗口上不斷刷新顯示,就完成了UDP實(shí)時(shí)視頻流的接收與播放。四、X264視頻編解碼庫(kù)編譯
在實(shí)時(shí)視頻傳輸中,需要對(duì)視頻進(jìn)行壓縮,減少數(shù)據(jù)流的size,才能在網(wǎng)絡(luò)中傳輸。因此我們需要使用視頻編碼,在編碼時(shí),我們可以選擇系統(tǒng)已經(jīng)自帶的編碼庫(kù),編碼庫(kù)是開(kāi)發(fā)板隨板提供的編碼SDK,隨板的編碼庫(kù),支持了板載硬編碼方式,方便直接調(diào)用。
而在使用中,我們有時(shí)需要自己優(yōu)化或者改造編碼,那么使用軟編碼也是一種方案,這里我們也準(zhǔn)備了軟編碼庫(kù)的編譯,并且在播放端也需要對(duì)視頻進(jìn)行解碼,那么也需要視頻解碼。,
首先通過(guò)互聯(lián)網(wǎng)獲取 x264 代碼庫(kù),如下:
git clonehttps://github.com/mirror/x264
![pYYBAGMYZiiAP2C2AACpz95pu6s836.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZiiAP2C2AACpz95pu6s836.png)
圖7
在PC上開(kāi)始進(jìn)行配置編譯./configure --enable-static --enable-shared --disable-asm
![poYBAGMYZimAKJ4IAAC3ufD82AI424.png](https://file.elecfans.com/web2/M00/67/81/poYBAGMYZimAKJ4IAAC3ufD82AI424.png)
圖8
然后進(jìn)行編譯
make
![pYYBAGMYZiqAGbsmAAGXXmHAb9k015.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZiqAGbsmAAGXXmHAb9k015.png)
圖9
![poYBAGMYZiuAfjjxAACCiTIQfAQ702.png](https://file.elecfans.com/web2/M00/67/81/poYBAGMYZiuAfjjxAACCiTIQfAQ702.png)
圖10
同時(shí)我們也可以在交叉編譯環(huán)境下,嘗試編譯開(kāi)發(fā)板上運(yùn)行的x264庫(kù),編譯配置經(jīng)過(guò)嘗試,以及修改相關(guān)config腳本后,執(zhí)行配置命令如下:
首先切換環(huán)境為交叉編譯環(huán)境,執(zhí)行source 命令:
source/home/lutherluo/workspace/G2LD/OKG2L-linux-sdk10/environment-setup-aarch64-smarc-rzg2l-toolchain
然后修改configure,讓其支持板上的poky-linux系統(tǒng),然后使用如下參數(shù),進(jìn)行makefile 文件的配置生成
./configure --enable-shared --host=aarch64-linux--cross-prefix=aarch64-poky-linux---sysroot=/opt/poky/3.1.5/sysroots/aarch64-poky-linux
最后開(kāi)始編譯
make
![pYYBAGMYZiyAG5B3AAflIrCsUVk822.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZiyAG5B3AAflIrCsUVk822.png)
圖11
![pYYBAGMYZi2AcFRHAAndwluZCZc936.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZi2AcFRHAAndwluZCZc936.png)
圖12
最終編譯成功過(guò),可以檢查一下編譯出的x264庫(kù),是ARM64 的動(dòng)態(tài)連接庫(kù)。五、實(shí)時(shí)視頻編碼推流代碼實(shí)現(xiàn)
有了上面的支持庫(kù)的準(zhǔn)備工作,就可以著手編寫(xiě)主機(jī)端的播放器軟件以及開(kāi)發(fā)板上的采集編碼推流軟件。
主機(jī)上采用QT開(kāi)發(fā)包,開(kāi)發(fā)一個(gè)簡(jiǎn)單的桌面應(yīng)用,使用QTDesigner快速的創(chuàng)建一個(gè)窗口,窗體中放置一個(gè)wiget控件做為視頻幀顯示區(qū),下部中間放置幾個(gè)按鈕,連接好信號(hào),槽后,按上面設(shè)計(jì)的時(shí)序圖完成,各個(gè)線程代碼和隊(duì)列的實(shí)現(xiàn)代碼,其界面設(shè)計(jì)和代碼設(shè)計(jì)如下圖:
![poYBAGMYZi6ALodzAAXkzDjz8lc467.png](https://file.elecfans.com/web2/M00/67/81/poYBAGMYZi6ALodzAAXkzDjz8lc467.png)
圖13
![pYYBAGMYZi-AWaILAAZCytkCNPU547.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZi-AWaILAAZCytkCNPU547.png)
圖14
代碼開(kāi)發(fā)運(yùn)行顯示如下圖,即等待H264的UDP數(shù)據(jù)中。![poYBAGMYZjCAZrClAAYtceASuBg102.png](https://file.elecfans.com/web2/M00/67/81/poYBAGMYZjCAZrClAAYtceASuBg102.png)
圖15
- V4L2_Video::V4L2_Video(QObject *parent) : QObject(parent)
- {
- m_is_start = false;
- pthread_mutex_init(&m_encode_queue_lock, nullptr);
- pthread_mutex_init(&m_send_queue_lock, nullptr);
- }
- int V4L2_Video::init()
- {
- struct v4l2_capability cap;
- struct v4l2_format fmt;
- struct v4l2_streamparm stream_parm;
- struct v4l2_requestbuffers req;
- struct v4l2_buffer buf;
- unsigned int buffer_n;
- pthread_t thread_id;
- int ret;
- fd = open(VIDEO_FILE, O_RDWR);
- if(fd == -1)
- {
- printf("Error opening V4L2 interfacen");
- return -1;
- }
- // 查詢(xún)?cè)O(shè)備屬性
- ioctl(fd, VIDIOC_QUERYCAP, &cap);
- printf("Driver Name:%snCard Name:%snBus info:%snDriver Version:%u.%u.%un",cap.driver,cap.card,cap.bus_info,(cap.version>>16)&0XFF, (cap.version>>8)&0XFF,cap.version&0XFF);
- //顯示所有支持幀格式
- struct v4l2_fmtdesc fmtdesc;
- fmtdesc.index=0;
- fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
- printf("Support format:n");
- while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc)!=-1)
- {
- printf("t%d.%sn",fmtdesc.index+1,fmtdesc.description);
- fmtdesc.index++;
- }
- // 設(shè)置幀格式
- fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; // 傳輸流類(lèi)型
- fmt.fmt.pix.width = IMAGEWIDTH; // 寬度
- fmt.fmt.pix.height = IMAGEHEIGHT; // 高度
- fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; // 采樣類(lèi)型
- // fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
- fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; // 采樣區(qū)域
- ret = ioctl(fd, VIDIOC_S_FMT, &fmt);
- if(ret < 0)
- {
- printf("Unable to set formatn");
- goto label_exit;
- }
- // 設(shè)置幀速率,設(shè)置采集幀率
- stream_parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- stream_parm.parm.capture.timeperframe.denominator = VIDEO_FPS;
- stream_parm.parm.capture.timeperframe.numerator = 1;
- ret = ioctl(fd, VIDIOC_S_PARM, &stream_parm);
- if(ret < 0)
- {
- printf("Unable to set frame raten");
- goto label_exit;
- }
- // 申請(qǐng)幀緩沖
- req.count = ENCODE_QUEUE_FRAME_NUM;
- req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- req.memory = V4L2_MEMORY_MMAP;
- ret = ioctl(fd, VIDIOC_REQBUFS, &req);
- if(ret < 0)
- {
- printf("request for buffers errorn");
- goto label_exit;
- }
- // 內(nèi)存映射
- video_buffer = static_cast(malloc(req.count * sizeof(VideoBuffer)));
- for(buffer_n = 0; buffer_n < ENCODE_QUEUE_FRAME_NUM; buffer_n++)
- {
- // memset(&buf, 0, sizeof(buf));
- buf.index = buffer_n;
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- buf.memory = V4L2_MEMORY_MMAP;
- ret = ioctl (fd, VIDIOC_QUERYBUF, &buf);
- if (ret < 0)
- {
- printf("query buffer errorn");
- goto label_exit;
- }
- video_buffer[buffer_n].start = static_cast(mmap(nullptr, buf.length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, buf.m.offset));
- video_buffer[buffer_n].length = buf.length;
- if(video_buffer[buffer_n].start == MAP_FAILED)
- {
- ret = -1;
- printf("buffer map errorn");
- goto label_exit;
- }
- // 放入緩存隊(duì)列
- ret = ioctl(fd, VIDIOC_QBUF, &buf);
- if (ret < 0)
- {
- printf("put in frame errorn");
- goto label_exit;
- }
- }
- // 創(chuàng)建幀獲取線程
- pthread_create(&thread_id, nullptr, frame_process_thread, this);
- // 創(chuàng)建編碼線程
- pthread_create(&thread_id, nullptr, yuyv422_to_H264_thread, this);
- // 創(chuàng)建編碼線程
- pthread_create(&thread_id, nullptr, h264_udp_broadcast_thread, this);
- return 0;
- label_exit:
- close(fd);
- return ret;
- }
開(kāi)發(fā)板端程序開(kāi)發(fā)使用V4l2框架,按上面總體設(shè)計(jì),完成各個(gè)工作線程的代碼實(shí)現(xiàn),隊(duì)列代碼的實(shí)現(xiàn),這里很多代碼除了窗口部分和主機(jī)代碼基本一致,因此可以支持copy過(guò)來(lái)復(fù)用,大大減少開(kāi)發(fā)開(kāi)發(fā)時(shí)間。
![pYYBAGMYZkSAF4fuAAFO7xsbCFE955.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZkSAF4fuAAFO7xsbCFE955.png)
圖16
![pYYBAGMYZkSAF4fuAAFO7xsbCFE955.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZkSAF4fuAAFO7xsbCFE955.png)
圖17
![pYYBAGMYZkWAPj_vAAHXpN0GRNg071.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZkWAPj_vAAHXpN0GRNg071.png)
圖18
六、實(shí)時(shí)視頻編碼推流測(cè)試使用前面獲得的攝像頭的設(shè)備參數(shù)以及能夠采集的視頻規(guī)格參數(shù),輸入到采集編碼端的程序中,就可以運(yùn)行視頻采集編碼推流測(cè)試程序了,這里測(cè)試時(shí),主機(jī)地址為192.168.50.212開(kāi)發(fā)板配置在同一路由器下,使用有線網(wǎng)絡(luò)地址為192.168.50.232。網(wǎng)絡(luò)配置好后,通過(guò)互ping檢查兩機(jī)通訊正常,網(wǎng)絡(luò)穩(wěn)定且時(shí)延較低時(shí),開(kāi)始進(jìn)行啟動(dòng)測(cè)試。
![poYBAGMYZkaAHCuwAAEtZNNFtQY939.png](https://file.elecfans.com/web2/M00/67/81/poYBAGMYZkaAHCuwAAEtZNNFtQY939.png)
圖19
首先啟動(dòng)主機(jī)端的程序,即在Ubuntu下啟動(dòng)播放器程序,然后在啟動(dòng)Gl2開(kāi)發(fā)板上的推流測(cè)試程序,操作結(jié)果如下圖:![poYBAGMYZkeAJ4q3AAEHH33rMEQ952.png](https://file.elecfans.com/web2/M00/67/81/poYBAGMYZkeAJ4q3AAEHH33rMEQ952.png)
圖20
![pYYBAGMYZkiAZGJtABIvTu8GKB0219.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZkiAZGJtABIvTu8GKB0219.png)
圖21
在幾秒后在主機(jī)端即可成功看到了開(kāi)發(fā)板上推送過(guò)來(lái)的直播流,視頻流很流暢,畫(huà)面完成,無(wú)馬賽克等問(wèn)題。不過(guò)視頻畫(huà)質(zhì)有點(diǎn)低,應(yīng)該是編寫(xiě)開(kāi)發(fā)板端編碼代碼時(shí),有關(guān)編碼碼率參數(shù)設(shè)置的較低有關(guān),這個(gè)在后面可以按需進(jìn)行優(yōu)化。隨文放了兩段視頻,一段是是手機(jī)拍攝直播編碼推送的攝像頭與開(kāi)發(fā)板的連接,主機(jī)端的播放程序以及接收到直播后的直播畫(huà)面。另外一段拍攝了一下對(duì)比直播時(shí)延的畫(huà)面,可以測(cè)試直播時(shí)延。
七、推流傳輸時(shí)延測(cè)評(píng)
最后使用開(kāi)發(fā)的測(cè)試程序,測(cè)試一下整體直播實(shí)時(shí)視頻的時(shí)延,測(cè)試方式是,將一個(gè)手機(jī)計(jì)時(shí)器打開(kāi)放到PC電腦顯示的Ubuntu播放器旁邊,再將攝像頭對(duì)準(zhǔn)手機(jī)和PC電腦屏幕,使手機(jī)實(shí)時(shí)時(shí)間和在播放器里播放畫(huà)面上的時(shí)間做對(duì)比就可以看出直播的時(shí)延。
試驗(yàn)測(cè)試圖圖下,實(shí)測(cè)視頻見(jiàn)文末拍攝的視頻畫(huà)面。
最后多次測(cè)試,系統(tǒng)整體時(shí)延在 300ms ,左右,這里需要解釋下,時(shí)延與攝像頭設(shè)備,采集,編碼,傳輸,解碼,播放各個(gè)環(huán)節(jié)都有關(guān),這里的測(cè)試的時(shí)延并不是開(kāi)發(fā)板硬件的時(shí)延,而是這個(gè)整體測(cè)試的時(shí)延,在通過(guò)對(duì)各個(gè)環(huán)節(jié)的優(yōu)化和壓縮處理流程,可以大幅減少時(shí)延,筆者在某款開(kāi)發(fā)板上進(jìn)過(guò)優(yōu)化軟件實(shí)現(xiàn),實(shí)現(xiàn)到<50ms的網(wǎng)絡(luò)視頻時(shí)延效果。
在實(shí)時(shí)采集編碼時(shí),開(kāi)發(fā)板的系統(tǒng)資源使用情況如下圖:
![pYYBAGMYZkmAd14wAAGZJv44Qhs439.png](https://file.elecfans.com/web2/M00/68/19/pYYBAGMYZkmAd14wAAGZJv44Qhs439.png)
圖22
可見(jiàn)板上資源消耗非常小,是因?yàn)?a href="http://www.solar-ruike.com.cn/v/tag/137/" target="_blank">芯片采用的硬編碼的方式,所以能夠較少的使用CPU的資源。從本次測(cè)試的效果看,開(kāi)發(fā)板系統(tǒng)采集編碼效率較高,能夠支持芯片實(shí)時(shí)的硬編碼和網(wǎng)絡(luò)發(fā)送。這為后面產(chǎn)品開(kāi)發(fā)提供很好的基礎(chǔ),在較長(zhǎng)時(shí)間(>60分鐘)的視頻編碼推送測(cè)試中,視頻編碼推送程序和系統(tǒng)運(yùn)行非常穩(wěn)定,沒(méi)有出現(xiàn)異常中斷等現(xiàn)象,并且在持續(xù)視頻采集中系統(tǒng)穩(wěn)定運(yùn)行,這也可以看出該開(kāi)發(fā)板在視頻處理時(shí)的穩(wěn)定性。
-----------------------------------干貨分割線-----------------------------
附件:
開(kāi)發(fā)板上編譯好的可形成測(cè)試軟件包,感興趣的可以在開(kāi)發(fā)板上測(cè)試一下,播放器可以用 VLC ,windows 或者 Ubuntu下均可以。
【項(xiàng)目源代碼+開(kāi)發(fā)板體驗(yàn)視頻,詳見(jiàn)作者原文帖子內(nèi)容】
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
飛凌
+關(guān)注
關(guān)注
0文章
134瀏覽量
16171 -
開(kāi)發(fā)板試用
+關(guān)注
關(guān)注
3文章
301瀏覽量
2147
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
飛凌嵌入式受邀亮相瑞薩2024工業(yè)技術(shù)研討會(huì)
飛凌嵌入式作為瑞薩電子的生態(tài)合作伙伴,給2024瑞薩電子MCU/MPU工業(yè)技術(shù)研討會(huì)的現(xiàn)場(chǎng)觀眾帶去了基于RZ/G2L高性能多核異構(gòu)處理器設(shè)計(jì)開(kāi)發(fā)
![<b class='flag-5'>飛</b><b class='flag-5'>凌</b>嵌入式受邀亮相瑞薩2024工業(yè)技術(shù)研討會(huì)](https://file1.elecfans.com/web3/M00/01/77/wKgZO2dT6riANnfsAADz9LLTiqQ651.png)
瑞薩RZ/G2L微處理器的SD卡GPIO控制功能介紹
RZ/G2L微處理器配備Cortex-A55(1.2 GHz) CPU、16位DDR3L/DDR4接口、帶Arm Mali-G31的3D圖形加速引擎以及
![瑞薩<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>微處理器的SD卡GPIO控制功能介紹](https://file1.elecfans.com/web3/M00/01/4C/wKgZO2dSYOaAVMYzAAA3zEBiTac266.png)
RZ/G2L高速虛擬串口方案 基于瑞薩RZ/G2L SMARC開(kāi)發(fā)板的虛擬(Virtual UART)實(shí)現(xiàn)方案
RZ/G2L具有豐富的外設(shè),比如千兆以太網(wǎng),CANFD以及豐富的UART接口,可以滿(mǎn)足工業(yè)數(shù)據(jù)收集處理相關(guān)的應(yīng)用。本文主要介紹基于瑞薩RZ/G2L SMARC
發(fā)表于 11-20 14:41
?572次閱讀
![<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>高速虛擬串口方案 基于瑞薩<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b> SMARC<b class='flag-5'>開(kāi)發(fā)板</b>的虛擬(Virtual UART)<b class='flag-5'>實(shí)現(xiàn)</b>方案](https://file1.elecfans.com/web1/M00/F5/80/wKgaoWc9hWmATb6MAAAOt1-nqSU153.png)
【飛凌嵌入式OK3576-C開(kāi)發(fā)板體驗(yàn)】開(kāi)箱報(bào)告
簡(jiǎn)介
很榮幸參與到本次由飛凌嵌入式和電子發(fā)燒友提供的OK3576-C開(kāi)發(fā)板的試用機(jī)會(huì)。
飛凌嵌入
發(fā)表于 08-22 02:13
飛凌全志T527開(kāi)發(fā)板buildroot系統(tǒng)下擴(kuò)大rootfs分區(qū)
一、實(shí)驗(yàn)環(huán)境介紹
硬件:飛凌T527開(kāi)發(fā)板(2G+16G)
軟件:全志Tina sdk
二、查看當(dāng)前存儲(chǔ)分布
登入開(kāi)發(fā)板,執(zhí)行 fdisk
發(fā)表于 07-18 14:45
RZ/G2L雙千兆網(wǎng)口使用場(chǎng)景 BASIC模式 SWITCH模式 ROUTER模式
RZ/G2L支持兩個(gè)通道的千兆以太網(wǎng)口,有必要給大家介紹一下這兩個(gè)千兆網(wǎng)口可實(shí)現(xiàn)的三種應(yīng)用場(chǎng)景,方便大家有針對(duì)性地給客戶(hù)的應(yīng)用場(chǎng)景做推廣。
![<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>雙千兆網(wǎng)口使用場(chǎng)景 BASIC模式 SWITCH模式 ROUTER模式](https://file1.elecfans.com/web2/M00/F8/10/wKgaomaD002Ab81YAAGYRTzrN8Y703.png)
線下培訓(xùn) | 瑞薩電子基于RZ/G2L的OpenAMP混合部署實(shí)戰(zhàn)培訓(xùn)
的處理器之間共享資源,實(shí)現(xiàn)高效的并行計(jì)算和實(shí)時(shí)數(shù)據(jù)交換,充分發(fā)揮異構(gòu)多核平臺(tái)的性能優(yōu)勢(shì)。RZ/G2L微處理器配備雙核ArmCortex-A55(1.2GHz)CPU和單
![線下培訓(xùn) | 瑞薩電子基于<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>的OpenAMP混合部署實(shí)戰(zhàn)培訓(xùn)](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
【米爾-瑞米派兼容樹(shù)莓派擴(kuò)展模塊-試用體驗(yàn)】值得擁有的米爾-瑞米派兼容樹(shù)莓派生態(tài)板
今天為大家介紹一塊米爾出的精致生態(tài)開(kāi)發(fā)板-米爾-瑞米派兼容樹(shù)莓派擴(kuò)展模塊。
超高性?xún)r(jià)比的RZ/G2L工業(yè)級(jí)處理器
RZ/G2L是瑞薩在智
發(fā)表于 05-13 11:28
RZ/G2L Demo調(diào)試經(jīng)驗(yàn)流程分享(1)
r01us0553ej0107-rz-g(Release Note).pdf,r01us0556ej0102-rz-g(Board_StartUp_Guide_smarcEVK).pdf,對(duì)SMARC EVK of RZ/
![<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b> Demo調(diào)試經(jīng)驗(yàn)流程分享(1)](https://file1.elecfans.com/web2/M00/E1/6A/wKgaomY4eEqAWBOeAAAxOi0H_9o441.png)
【米爾-瑞米派兼容樹(shù)莓派擴(kuò)展模塊-試用體驗(yàn)】基于ROS系統(tǒng)的三麥輪小車(chē)自主導(dǎo)航
導(dǎo)航。
本次試用套件包括:開(kāi)發(fā)板1塊,tty2usb線1根
和手邊的樹(shù)莓派對(duì)比一下大?。?
3、開(kāi)發(fā)板介紹
Remi Pi 是一款工業(yè)級(jí)處理器,基于瑞薩
發(fā)表于 04-16 22:51
RZ/G2L SD卡啟動(dòng)環(huán)境變量存儲(chǔ)設(shè)置
RZ/G2L微處理器配備Cortex-A55(1.2 GHz)CPU、16位DDR3L/DDR4接口、帶Arm Mali-G31的3D圖形加速引擎以及
![<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b> SD卡啟動(dòng)環(huán)境變量存儲(chǔ)設(shè)置](https://file1.elecfans.com/web2/M00/C5/40/wKgZomX7zJiAOxtwAABAf5VPZA0933.png)
瑞薩RZ/V2L預(yù)訓(xùn)練的人工智能模型
RZ/V2L還與RZ/G2L封裝和引腳兼容。這使得RZ/G2L用戶(hù)可輕松升級(jí)至
發(fā)表于 03-21 13:51
?455次閱讀
![瑞薩<b class='flag-5'>RZ</b>/V<b class='flag-5'>2L</b>預(yù)訓(xùn)練的人工智能模型](https://file1.elecfans.com/web2/M00/C6/2A/wKgaomX7y-CAI1mTAAA-r6pQXIs896.png)
RZ/G2L微處理器DDR ECC功能和機(jī)制概要
RZ/G2L微處理器配備Cortex?-A55 (1.2 GHz) CPU、16位DDR3L/DDR4接口、帶Arm Mali-G31的3D圖形加速引擎以及
![<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>微處理器DDR ECC功能和機(jī)制概要](https://file1.elecfans.com/web2/M00/C1/C7/wKgZomXeyKiAALMaAAA6a_WH4b8118.png)
評(píng)論