rtp問題引領匯總

視頻網絡傳輸一定要用rtp嗎?

RTP/RTCP有一套很好的反饋機制,通過其可以估算網絡狀況,然后在編碼端進行調整,如網絡繁忙時適當的降低畫面質量,減小碼率等,主要是想通過RTP/RTCP協議實現QoS!同時也可以用http或udp啊,都可以的,自己再加一些控制信息。利用rtp/rtcp的好處是這個協議本身幫你加入了 一些控制信息

相信有不少人和我一樣,希望實現H264格式視頻流媒體播放。但是對于一個新手來說,往往不知道從何入手。利用百度,GOOGLE等搜索資料真是沙里淘金。在琢磨了N周之后,才弄出來了點成果,其中費了很多無用的功夫,光看英文協議就費了一周,后來才知道有中文版,并且我所達到的目的很簡單,只要讓VLC實時播放就行,不需要了解整個協議。我也很希望能直接搜出來一套代碼,都一直沒找到,還是得自己動手。現在我把代碼貼出來,希望對做類似工程的朋友有所幫助。


????????? 一、本示例代碼在我的電腦上實現了對標準H264碼流的RTP打包發送到本機的1234端口,用VLC播放器從1234端口能接收到該碼流并實時播放。代碼附有詳細的注釋,應該很容易理解(前提是大家稍微對RFC3550 RFC3984協議有了解)。


????????? 二、本示例代碼是按照RFC3984協議僅完成了RTP打包,并沒有完成發送RTCP。原因就引用這位達人的話:“1.RTCP里頭有很多關于RTCP發送簡隔的時間計算,RTP信息的統計,這種操作不是難,而是煩,我不想去寫。2.RTCP和RTP一開始出來的時候并不是因為視頻的點播等應用的,而是視頻會議。RTCP有管理與會者的層面含義,這一功能在很多場合并不會用到。3.我想簡單,沒有寫多個流間的同步,如一個影片的視頻和音頻流。這些其實是RTCP來完成的。我懶得去寫,因為這些功作RTP的各個庫類(例如JRTPLIB庫)都做得很好。我覺得用庫的最大優點就在這吧”。


????????? 三、和代碼相關的原理性的東西,大家應該去看看RFC3550,RFC3984.這兩份協議都有熱心網友翻譯好的中文版。我把他們放在壓縮包里,大家就不用再累個半死去搜索注冊下載了。如果為了更省事,我覺得看看這位網友總結的RFC3984的內容就夠了。網址是
http://www.cppblog.com/czanyou/archive/2009/12/25/67940.html。如果打不開網頁,就到壓縮包里資料文件夾下找吧。我已經把網頁保存下來了。


????????? 四、代碼并非是我完全原創的,而是我在搜索到得網友的代碼的基礎上修改的。這里要特別感謝以下幾位網友:
1.貓頭上的鷹(他的博客地址
http://blog.csdn.net/Tinnal/archive/2008/09/03/2871734.aspx)在他的博客里我第一次找到了有價值的東西,并且他無償提供的MPEG的RTP打包源碼只要拷貝下來建個工程就能實現MPEG的流媒體,對我啟發很大。
2.liming,他提供的代碼已經實現了H264的碼流分析,將其中的每個NALU單元分離開來,并分析出了NALU的類型,長度等信息。為我實現RTP打包提供了很大的方便,事實上,這份示例代碼就是在他的代碼上添加了RTP打包部分,我連工程名字都沒有改。他的源代碼在這里
3.luny,他提供的SDP文件在關鍵時候幫了我大忙,我發送的RTP數據包通過Wireshark抓包工具分析一直沒錯,可VLC播放器就是沒任何反應。直到下載了他的SDP文件文件后終于出畫面了。某位網友說VLC對H264只能通過TS封包或SDP文件打開RTP碼流,在此我這么懷疑。
4.jessiepan和他的帖子,
http://topic.csdn.net/u/20090725/11/5FBC75B0-1091-4DD4-9154-3E3D59F9B6D1.html,這里提供了很多有用的信息。


??????????? 使用方法:直接在VC6上打開工程,編譯。(需要注意的是大家要把IP地址改為自己的。在h264.h的#define DEST_IP ?? ??? "192.168.0.30"和#define DEST_PORT 1234這兩行修改就行了。同時w.sdp文件里也要改成一致的IP和端口號,不然VLC是接受不到數據的。在c=IN IP4 192.168.0.30 和m=video 1234 RTP/AVP 96這兩行。中間的1234是我設置的端口號。)在執行程序之前,先用VLC打開w.sdp文件,然后執行程序,就可以看到畫面了:)。同樣需要注意的是VLC1.0以后的版本不支持直接打開h.264視頻文件,但是0.97版本就支持。這里我測試用1.03和0.97兩份版本]的VLC都可以接受并播放h.264RTP碼流。


目前還有幾個問題我沒有弄明白,希望有高手在看完這個帖子后能幫我解答:


1.關于時間戳的設置。RFC3984里沒有提到時間戳具體如何計算,我也是按照各方面的小道消息這樣設置。unsigned int timestamp_increse=0;timestamp_increse=(unsigned int)(90000.0 / framerate); 即初始值設為0,時間戳增量設為90000.0 / framerate,framerate我設為25,即每秒25幀。每發送一個NALU單元,時間戳增加。若是該NALU大于1400字節,需要分片時,則多個分片擁有相同的時間戳。這樣設置是否正確。請牛人給個權威解答。
2.按照我的理解,SDP文件僅實現了告訴VLC在哪個IP和端口接受264RTP包,同樣的信息我也通過在VLC的媒體-》打開網絡串流,協議選RTP,然后填寫IP和端口號中設置好了,為什么用打開SDP文件的方法能接收,但用后者VLC卻沒有一點反應。
3.當我將幀率設為25時(即代碼里的float framerate=25;)vlc能接受碼流,但會比較卡,常緩沖,提示錯誤為main error: ES_OUT_SET_(GROUP_)PCR?? is called too late, increasing pts_delay to 339 ms。我懷疑是我的電腦發送UDP包速度不夠每秒播放25幀的所需要的UDP包數量,因此在SDP文件我添加了a=framerate:15來限制播放器每秒播放15幀,同時在代碼里的相應行float framerate=15;也將幀率改為15這樣雖然解決了卡的問題,但是視頻播放很慢。請問要是我想達到每秒播放25幀,難道只能換臺好電腦了?
5.下一步我想用jrtplib來打包RTP,因為聽說用這個庫實現RTCP很方便,是不是這個庫會根據網絡狀況自動發送RTCP信息。如果哪位高手有這方面的代碼或者是實現了RTSP的代碼,希望能拿出來交流,哪怕是部分代碼或者是實現部分功能也好。

1、第一個問題,如果你看過 RFC3984 就應該知道答案;
2、第三個問題,我認為不是發包速度的問題,發包其實是非常快的;
3、第四個問題,可以參考 Darwin 的源代碼(下載地址:http://dss.macosforge.org/),不過這套代碼非常龐大。VLC 的服務端源代碼也應該會發 RTCP 吧?

A:RFC里說時間戳是RTP數據包里第一個字節的采樣時間,就是說我在給一個NALU數據打上報頭的時候調用系統函數time()來獲取當前的系統時間(從1970年1月一日到現在所經過的秒數),這個秒數就是應該打在RTP包頭上的時間戳嗎? 還有RFC3984里提到必須使用90K的時鐘,這個90K的時鐘是干什么用的了?麻煩解答一下

我認為其實時間戳從 0 開始也可以。90K 是一個參考時鐘,例如你的系統是 30fps,那么幀與幀之間的時間戳增量就該是 90000 / 30 = 3000。

A:謝謝版主,那我在第一個問題中敘述的時間戳設置方法看來是蒙對了啊。
不過關于第三個問題,當我把幀率設為25fps時,VLC經常緩沖,然后就會有馬賽克了。版主知道這可能是什么原因嗎??? 經過我測試,只要幀率設為18fps以下,就沒有這個問題。

這個得做實驗具體分析了。有誤碼,說明碼流出錯了。先截取一下 VLC 收到的碼流,看是否是正確的。

A:我用LZ的程序進行傳輸并播放,LZ程序中自帶的兩個.264文件都能正常播放,但是我用JM編碼生成的.264文件就不能播放,這是為什么呢?請高手解答~~~

因為 JM 編碼生成的 RTP 格式的 264 碼流不是標準 RTP 格式。

A:我想請教您一個問題?? 如果不打成RTP包 直接打成TCP包可以么 我這個問題問的很無知 但是還是請您回答我下

如果打成TCP包,那就只有你自己的播放器能播了,因為通用的播放器,或者說是標準的播放器,都是播放RTP打包的數據。

A:如何判斷nalu是否屬于同一幀圖像呢,難道根據unit_type嗎?貌似這樣也不對啊,nalu里有沒有什么信息可以用來判斷的嗎,等待牛人指導。

編碼器自己本來就知道哪些 NALU 屬于一幀。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455837.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455837.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455837.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django的信號機制詳解

Django的信號機制詳解 Django提供一種信號機制。其實就是觀察者模式,又叫發布-訂閱(Publish/Subscribe) 。當發生一些動作的時候,發出信號,然后監聽了這個信號的函數就會執行。 Django內置了一些信號,比如: django.…

垃圾回收算法_垃圾回收算法有哪些

垃圾檢測通常通過建立一個根對象的集合以及建立一個從這些根對象開始能夠觸及的對象集合來實現。如果正在執行的程序可以訪問到根對象和某個對象之間存在引用路徑,這個對象就是可觸及的。對于程序來說,根對象總是可以訪問的。從這些根對象開始&#xff0…

不錯的電子書下載網站

為什么80%的碼農都做不了架構師?>>> www.jb51.net 電子書質量不錯,雖然是掃描版的,但是都是高清的. vdisk.weibo.com 網盤, 內容很多! 轉載于:https://my.oschina.net/GMT/blog/1188971

GeoHash核心原理解析

原文地址:http://www.cnblogs.com/LBSer/p/3310455.html geohash for php:附件下載geohash.tar.gz 引子 機機是個好動又好學的孩子,平日里就喜歡拿著手機地圖點點按按來查詢一些好玩的東西。某一天機機到北海公園游玩,肚肚餓了&am…

[轉載]流行視頻格式講解

*. MPEG/.MPG/.DAT MPEG也是Motion Picture Experts Group 的縮寫。這類格式包括了 MPEG-1, MPEG-2 和 MPEG-4在內的多種視頻格式。MPEG-1相信是大家接觸得最多的了,因為目前其正在被廣泛地應用在 VCD 的制作和一些視頻片段下載的網絡應用上面,大部分的…

Ajax相關介紹

ajax是什么? AJAX 是與服務器交換數據并更新部分網頁的藝術,在不重新加載整個頁面的情況下。 AJAX 指異步 JavaScript 及 XML(Asynchronous JavaScript And XML)。 AJAX 是一種在 2005 年由 Google 推廣開來的編程模式。 AJAX 不是一種新的…

解決Ubuntu中文件管理器死掉的情況

有時會遇到Ubuntu文件管理器死掉的情況,怎么點擊都沒有反應,這時只需在終端上運行 ps -A | grep nautilus, 查找文件管理器nautilus對應的pid,然后sudokillpid就可以關閉文件管理器進程,隨便點擊一個文件夾就可以重啟文件管理器了…

element table 怎么知道點擊的是第幾行_el-data-table, 讓CRUD更簡單??

基于Vue2.x, element-ui 2.x,以及開源組件el-form-renderer封裝了一個業務組件el-data-table,已在github開源,其目標是:makes restful api crud easily 特點:1. 使用axios自動發送請求2.自帶新增/修改/刪除邏輯(默認新…

Win10無法使用小娜搜索本地應用問題的解決方案

小娜介紹 win10的Cortana小娜是一個功能非常強大的語音和搜索助手,用戶可以通過小娜助手搜索任意的文件和應用軟件,不過有用戶發現win10的小娜搜索不到已安裝的本地軟件,那么win10小娜助手無法搜索本地應用怎么解決呢?下面小編教大…

樣本量

sklearn實戰-乳腺癌細胞數據挖掘(博客主親自錄制視頻教程) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 根據power,effect size,a,決定樣本量 # -*- cod…

【Python】 dict 以key名 去重運算

將日期相同的數據統計在一起 a_count [ {create_time: 2020-03-05, total_len: 1, count_invite: 1}, {create_time: 2020-03-11, total_len: 2, count_invite: 2}, {create_time: 2020-03-18, total_len: 2, count_invite: 2}, {create_time: 2020-03-06, total_len: 1, …

Vue相關知識總結

Vue簡介 Vue是js的一個庫,類似于JQuery Vue當前版本已經發展到2.X版本,并且現在市面上基本使用的都是2.X版本. 現在一些知名的互聯網公司,例如滴滴,美團等,都在大量的使用vue 本段內容主要講解Vue的基本知識和指令,了解vue的基本概念 注意: Vue 不支持 IE8 及以下版本 vue中…

宏塊幀內預測的具體過程

對一個宏塊進行幀內預測的具體過程如下: (1)對于8x8色度塊就選擇一種幀內色度預測模式建立相應的幀內預測塊; (2)按遍歷的方法分別計算4種Intra_16x16幀內預測模式的代價(Rdcost16x16&#xf…

qt獲得 cpu 主頻信息_高主頻有什么用?我們玩了幾款3A大作找到答案

[PConline 雜談]對于熱愛游戲的人來說,能在極致特效下流暢運行喜歡的游戲是一件幸事,因此作為影響游戲運算的CPU重要性不容小視。CPU如何判定?眾所周知,核心數和主頻算是判定一個CPU好壞的主要依據,但大多數CPU產品在高…

解決:關于Git無法提交 index.lock File exists的問題

問題 今天提交代碼時,在一次提交,莫名其妙沒成功后,再次用git commit -a命令時,出現以下錯誤,無論是用git還是TortoiseGit等其他客戶端都會出現以下這個問題。。 錯誤日志 $ git commit -a fatal: Unable to create …

span居中

在父元素中加style"text-align:center"; 比如下面這樣 <head></head><body><div style"width:300px;border:1px red solid;text-align:center;"><span style"width:100px;">測試</span></div></bo…

打造自己的 APP「冰與火百科」(一):分析定位

回想自己最開始學習 Android 的動力&#xff0c;其實很簡單&#xff0c;就是想在手機上看到自己設計的 APP。但是在工作后&#xff0c;一直做的都是「別人」的 APP&#xff0c;偶爾還要做一些自己不太認可的設計和交互&#xff0c;從中獲取到的成就感還不及第一次在手機上看到「…

python爬取有道翻譯

python爬蟲爬取有道翻譯教程 編寫環境 為了寶寶們能夠正確讀懂本教程,在正式開始前,寶寶們需要搭建的環境如下: 連接互聯網的win10電腦,(win7也可以)Google瀏覽器(版本無要求)Python(版本3就可以了),如果沒有安裝的小伙伴可以參考python安裝以及版本檢測requests庫(版本沒啥…

PartitionMotionSearch()

Outline: 1、 CFG文件中有關多參考幀的相關選項 2、 多參考幀涉及到的數據結構和全局變量 3、 保存重建圖像為參考幀 4、 編碼一幀前&#xff0c;設置參考幀列表 5、 多參考幀的使用&#xff08;即參考幀的選擇策略問題&#xff09; 6、 遺留問題 1、CFG文件中有關多參考…

bat 發送post請求_get post 請求

HTTP是一個基于TCP/IP來傳遞數據的通信協議。1.GET和POST請求的區別&#xff1f;a: GET/POST本質上都是TCP鏈接&#xff0c;GET傳body和POST拼參數&#xff0c;理論上都是可行的。b: 實際上HTTP協議對URL長度是沒有限制的&#xff1b;限制URL長度大多數是瀏覽器或者服務器的配置…