吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【飛凌RZ/G2L開(kāi)發(fā)板試用體驗(yàn)】飛凌RZ/G2L的開(kāi)發(fā)板試用測(cè)評(píng)報(bào)告三 -- 實(shí)時(shí)視頻編碼推流設(shè)計(jì)與實(shí)現(xiàn)

開(kāi)發(fā)板試用精選 ? 來(lái)源:開(kāi)發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-10-21 14:15 ? 次閱讀

本文來(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
圖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
圖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
圖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
圖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
圖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~63
lVideo 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
圖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
圖7
在PC上開(kāi)始進(jìn)行配置編譯
./configure --enable-static --enable-shared --disable-asm
poYBAGMYZimAKJ4IAAC3ufD82AI424.png
圖8

然后進(jìn)行編譯
make
pYYBAGMYZiqAGbsmAAGXXmHAb9k015.png
圖9
poYBAGMYZiuAfjjxAACCiTIQfAQ702.png
圖10
就得到了最新版本的X264編解碼庫(kù)。
同時(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
圖11
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
圖13
pYYBAGMYZi-AWaILAAZCytkCNPU547.png
圖14
代碼開(kāi)發(fā)運(yùn)行顯示如下圖,即等待H264的UDP數(shù)據(jù)中。
poYBAGMYZjCAZrClAAYtceASuBg102.png
圖15
核心部分代碼如下:



  1. V4L2_Video::V4L2_Video(QObject *parent) : QObject(parent)
  2. {
  3. m_is_start = false;
  4. pthread_mutex_init(&m_encode_queue_lock, nullptr);
  5. pthread_mutex_init(&m_send_queue_lock, nullptr);
  6. }
  7. int V4L2_Video::init()
  8. {
  9. struct v4l2_capability cap;
  10. struct v4l2_format fmt;
  11. struct v4l2_streamparm stream_parm;
  12. struct v4l2_requestbuffers req;
  13. struct v4l2_buffer buf;
  14. unsigned int buffer_n;
  15. pthread_t thread_id;
  16. int ret;
  17. fd = open(VIDEO_FILE, O_RDWR);
  18. if(fd == -1)
  19. {
  20. printf("Error opening V4L2 interfacen");
  21. return -1;
  22. }
  23. // 查詢(xún)?cè)O(shè)備屬性
  24. ioctl(fd, VIDIOC_QUERYCAP, &cap);
  25. 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);
  26. //顯示所有支持幀格式
  27. struct v4l2_fmtdesc fmtdesc;
  28. fmtdesc.index=0;
  29. fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
  30. printf("Support format:n");
  31. while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc)!=-1)
  32. {
  33. printf("t%d.%sn",fmtdesc.index+1,fmtdesc.description);
  34. fmtdesc.index++;
  35. }
  36. // 設(shè)置幀格式
  37. fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; // 傳輸流類(lèi)型
  38. fmt.fmt.pix.width = IMAGEWIDTH; // 寬度
  39. fmt.fmt.pix.height = IMAGEHEIGHT; // 高度
  40. fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; // 采樣類(lèi)型
  41. // fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
  42. fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; // 采樣區(qū)域
  43. ret = ioctl(fd, VIDIOC_S_FMT, &fmt);
  44. if(ret < 0)
  45. {
  46. printf("Unable to set formatn");
  47. goto label_exit;
  48. }
  49. // 設(shè)置幀速率,設(shè)置采集幀率
  50. stream_parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  51. stream_parm.parm.capture.timeperframe.denominator = VIDEO_FPS;
  52. stream_parm.parm.capture.timeperframe.numerator = 1;
  53. ret = ioctl(fd, VIDIOC_S_PARM, &stream_parm);
  54. if(ret < 0)
  55. {
  56. printf("Unable to set frame raten");
  57. goto label_exit;
  58. }
  59. // 申請(qǐng)幀緩沖
  60. req.count = ENCODE_QUEUE_FRAME_NUM;
  61. req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  62. req.memory = V4L2_MEMORY_MMAP;
  63. ret = ioctl(fd, VIDIOC_REQBUFS, &req);
  64. if(ret < 0)
  65. {
  66. printf("request for buffers errorn");
  67. goto label_exit;
  68. }
  69. // 內(nèi)存映射
  70. video_buffer = static_cast(malloc(req.count * sizeof(VideoBuffer)));
  71. for(buffer_n = 0; buffer_n < ENCODE_QUEUE_FRAME_NUM; buffer_n++)
  72. {
  73. // memset(&buf, 0, sizeof(buf));
  74. buf.index = buffer_n;
  75. buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  76. buf.memory = V4L2_MEMORY_MMAP;
  77. ret = ioctl (fd, VIDIOC_QUERYBUF, &buf);
  78. if (ret < 0)
  79. {
  80. printf("query buffer errorn");
  81. goto label_exit;
  82. }
  83. video_buffer[buffer_n].start = static_cast(mmap(nullptr, buf.length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, buf.m.offset));
  84. video_buffer[buffer_n].length = buf.length;
  85. if(video_buffer[buffer_n].start == MAP_FAILED)
  86. {
  87. ret = -1;
  88. printf("buffer map errorn");
  89. goto label_exit;
  90. }
  91. // 放入緩存隊(duì)列
  92. ret = ioctl(fd, VIDIOC_QBUF, &buf);
  93. if (ret < 0)
  94. {
  95. printf("put in frame errorn");
  96. goto label_exit;
  97. }
  98. }
  99. // 創(chuàng)建幀獲取線程
  100. pthread_create(&thread_id, nullptr, frame_process_thread, this);
  101. // 創(chuàng)建編碼線程
  102. pthread_create(&thread_id, nullptr, yuyv422_to_H264_thread, this);
  103. // 創(chuàng)建編碼線程
  104. pthread_create(&thread_id, nullptr, h264_udp_broadcast_thread, this);
  105. return 0;
  106. label_exit:
  107. close(fd);
  108. return ret;
  109. }
復(fù)制代碼



開(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
圖16
pYYBAGMYZkSAF4fuAAFO7xsbCFE955.png
圖17
然后編譯,檢查編譯的結(jié)果,變成位 ARM aarch64版本,然后傳送到開(kāi)發(fā)板上準(zhǔn)被執(zhí)行:

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
圖19
首先啟動(dòng)主機(jī)端的程序,即在Ubuntu下啟動(dòng)播放器程序,然后在啟動(dòng)Gl2開(kāi)發(fā)板上的推流測(cè)試程序,操作結(jié)果如下圖:
poYBAGMYZkeAJ4q3AAEHH33rMEQ952.png
圖20
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
圖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)注

    3

    文章

    301

    瀏覽量

    2147
收藏 人收藏

    評(pí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ā)
    的頭像 發(fā)表于 12-07 14:27 ?413次閱讀
    <b class='flag-5'>飛</b><b class='flag-5'>凌</b>嵌入式受邀亮相瑞薩2024工業(yè)技術(shù)研討會(huì)

    瑞薩RZ/G2L微處理器的SD卡GPIO控制功能介紹

    RZ/G2L微處理器配備Cortex-A55(1.2 GHz) CPU、16位DDR3L/DDR4接口、帶Arm Mali-G31的3D圖形加速引擎以及
    的頭像 發(fā)表于 12-06 10:25 ?1209次閱讀
    瑞薩<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>微處理器的SD卡GPIO控制功能介紹

    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>方案

    嵌入式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

    RZ/G2L串口SCI的使用(下)

    RZ/G2L串口SCI的使用
    的頭像 發(fā)表于 08-03 08:06 ?565次閱讀
    <b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>串口SCI的使用(下)

    RZ/G2L串口SCI的使用(上)

    RZ/G2L串口SCI的使用
    的頭像 發(fā)表于 07-25 08:06 ?559次閱讀
    <b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>串口SCI的使用(上)

    全志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)景做推廣。
    的頭像 發(fā)表于 07-02 18:12 ?2001次閱讀
    <b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>雙千兆網(wǎng)口使用場(chǎng)景 BASIC模式 SWITCH模式 ROUTER模式

    線下培訓(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和單
    的頭像 發(fā)表于 05-17 08:01 ?639次閱讀
    線下培訓(xùn) | 瑞薩電子基于<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>的OpenAMP混合部署實(shí)戰(zhàn)培訓(xùn)

    【米爾-瑞米派兼容樹(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/
    的頭像 發(fā)表于 05-06 14:25 ?738次閱讀
    <b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b> Demo調(diào)試經(jīng)驗(yàn)流程分享(1)

    【米爾-瑞米派兼容樹(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圖形加速引擎以及
    的頭像 發(fā)表于 03-21 13:56 ?632次閱讀
    <b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b> SD卡啟動(dòng)環(huán)境變量存儲(chǔ)設(shè)置

    瑞薩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)練的人工智能模型

    RZ/G2L微處理器DDR ECC功能和機(jī)制概要

    RZ/G2L微處理器配備Cortex?-A55 (1.2 GHz) CPU、16位DDR3L/DDR4接口、帶Arm Mali-G31的3D圖形加速引擎以及
    的頭像 發(fā)表于 02-28 13:44 ?1407次閱讀
    <b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>微處理器DDR ECC功能和機(jī)制概要
    百家乐网上投注作弊| 新星娱乐城| 大发888下载亚洲城| 百家乐园搏彩论坛| 迪威百家乐官网娱乐平台| 利都百家乐官网国际娱乐场| 百家乐官网有电脑游戏吗| 博九百家乐官网娱乐城| 新葡京百家乐官网娱乐城 | 澳门网上网址| 网络真人赌博| 百家乐官网小77论坛| 新朝代百家乐官网开户网站 | 百家乐官网如何看面| 上海玩百家乐官网算不算违法| 香港六合彩资料| 绿春县| 云鼎百家乐官网程序开发有限公司| 百家乐官网赌博策略大全| 百家乐tt娱乐| 迪威百家乐娱乐场| 大发888 登陆不上| 大发888什么赢钱快| 投注平台网| 百家乐官网网站排行| 百家乐官网高返水| 做生意的信风水吗| 百家乐赌博论坛在线| 在线百家乐电脑| 大发888官方6222.c| 从江县| 百家乐官网科学| 百家乐娱乐城优惠| 单双和百家乐游戏机厂家| 百家乐顺序| 大发888官网注册| 百家乐官网单跳投注法| 金沙百家乐官网的玩法技巧和规则| 百家乐经验在哪找| 大发888娱乐场存款| 大发888下载 客户端|