按照RFC3984協議實現H264視頻流媒體 RTSP H264

轉自:http://topic.csdn.net/u/20100104/16/0fd992e8-b0a6-4c2b-85a4-d9513d3b1491.html

?

相信有不少人和我一樣,希望實現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打包部分,我連工程名字都沒有改。他的源代碼在這里http://www.pudn.com/detail.asp?id=510807。3****,他提供的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版本就支持。兩個版本的VLC播放器大家去著哩下載這里我測試用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的代碼,希望能拿出來交流,哪怕是部分代碼或者是實現部分功能也好。
? 源碼下載地址:http://download.csdn.net/source/1961862大家下載后有什么問題可以直接和我聯系,不留郵箱了,直接留QQ號吧:1002666420.另外我這里還有一個老外寫的用LIVE555庫實現H264 STREAMING的教程及代碼,有需要的可以聯系我。


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

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

相關文章

搭建SSM框架之Spring

作為一枚大四準備畢業的學生,最重要的事便是畢業設計,前些日子剛剛拿到畢設題目:“3D網絡圖:面向網絡結構數據的可視化軟件設計”,(⊙o⊙)…,怎么說哪,看到題目就是一頭霧水(前幾屆不…

audio unity 加速_淺談Unity中Android、iOS音頻延遲

在Unity上面做音游,當在移動端實機運行起來,會發現,音頻的發出會有一定的延遲,無論是長音效還是短音效,Unity內置的Audio內部使用的是FMOD,有以下手段改善通過設置稍微改善其延遲的問題Edit → Project Set…

深度學習之 hard negative mining (難例挖掘)

Hard Negative Mining Method 思想 hard是困難樣本,negative是負樣本,hard negative就是說在對負樣本分類時候,loss比較大(label與prediction相差較大)的那些樣本,也可以說是容易將負樣本看成正樣本的那些…

單列表_使用Excel中的quot;記錄單quot;功能快速錄入數據

在Excel中進行數據錄入的時候,平常都是一行一行地錄入數據,但是有時候在單元格之間,行與行,列與列之間頻繁地切換去錄入數據,費事費力還容易出錯。今天給你推薦一個既好用又有效率的Excel中的隱藏功能——“記錄單”。…

CentOS 6.9下的Setup工具(用于管理服務/防火墻/網絡配置/驗證服務)

說明:Setup工具套件好像是CentOS下特有的用于管理服務/防火墻/網絡配置等,其實就是基于命令行模式界面的GUI工具。唯一特點就是方便。 安裝: #安裝Setup命令工具 yum -y install setuptool #安裝Setup工具配套的系統服務組件 yum -y insta…

wireshark解析rtp協議,流媒體中的AMR/H263/H264包的方法

原文教程:http://hi.baidu.com/zjxiaoyu3/blog/item/22f9f18f32b45de5f11f3670.html 抓到完整的流媒體包之后,用wireshark打開,其中的包可能不會自動映射成RTP+AMR/H263/H264的包,做如下修改操作…

深度學習之非極大值抑制(Non-maximum suppression,NMS)

非極大值抑制(Non-maximum suppression,NMS)是一種去除非極大值的算法,常用于計算機視覺中的邊緣檢測、物體識別等。 算法流程 給出一張圖片和上面許多物體檢測的候選框(即每個框可能都代表某種物體)&…

148. 顏色分類

給定一個包含紅,白,藍且長度為 n 的數組,將數組元素進行分類使相同顏色的元素相鄰,并按照紅、白、藍的順序進行排序。 我們可以使用整數 0,1 和 2 分別代表紅,白,藍。 注意事項 不能使用代碼庫中…

vue項目token放在哪里_關于vue動態菜單的那點事

vue-element-admin4.0國內節點訪問地址:https://panjiachen.gitee.io/vue-element-admin-site/zh/本此使用的是https://github.com/PanJiaChen/vue-element-admin/tree/i18n 國際化分支的版本。說是除了國際化其他都一樣。本文主要介紹前臺動態的使用資源權限。后臺…

H264學習方法歷程資料

我的H.264學習歷程 半年前,我知道了H.264這個名詞。那個時候決定學習H.264,可是我連資料都不知道如何收集。而且整個學校就只有我一個人在學習H.264, 找不到人交流,所以那個時候學得真的是舉步維艱,很痛苦&#xff0c…

深度學習之 ROI Pooling

什么是ROI? ROI是 Region of interest 的簡寫,指的是 Faster R-CNN 結構中,經過 RPN 層后,產生的 proposal 對應的 box 框。 ROI Pooling 顧名思義,是 pooling 層的一種,而且是針對 ROIs 的 pooling。整個…

KD樹小結

很久之前我就想過怎么快速在二維平面上查找一個區域的信息,思考許久無果,只能想到幾種優秀一點的暴力。 KD樹就是干上面那件事的。 別的不多說,趕緊把自己的理解寫下來,免得涼了。 KD樹的組成 以維護k維空間(x,y,……)內的KD樹為例…

多元函數求極值中的a_多元函數的條件極值和拉格朗日乘數法

、條件極值、拉格朗日乘數法1. 轉化為無條件極值在討論多元函數極值問題時,如果遇到除了在定義域中尋求駐點(可能的極值點)外,對自變量再無別的限制條件,我們稱這類問題為函數的無條件極值。如求的極值,就是無條件極值問題。然而在…

深度學習之 RPN(RegionProposal Network)- 區域候選網絡

anchor boxes基本概念與作用: feature map 上的一個點可以映射回輸入圖片上的一個點,以特征圖上這個點為中心,預先人為設定 k 個 boxes,這些 boxes 就稱為在這個點上生成的 k 個 anchor boxes(所有anchor boxes的中心點坐標是一樣…

h264的碼率控制 JVT-G012

開始看h264的碼率控制,很多地方都提到 G012,拿來做為參考比較,看來很有必要研究清楚。 偶這人,E文文檔不翻譯的話,看過就忘了,于是草草翻譯了下,因為不打算做B幀,也不準備在同一幀中…

Android RecyclerView嵌套EditView實時更新Item數據

一、場景(例如:購物車) 1、當我們需要以列表樣式管理某些數據時,可能需要列表項的某個字段可編輯 2、編輯Item上的某個字段后可能還要更新相關字段的值 二、可能遇到的問題 1、列表滑動導致輸入框中的數據錯位(或者焦點…

workbench拓撲優化教程_優化技術在水泵水力設計的應用(上篇)

文章來源:安世亞太官方訂閱號(搜索:Peraglobal)CFD技術在泵的內流數值模擬、研究泵內部流動規律和結構方面已廣泛應用,取得了很多成果。但是初步設計的產品如果通過CFD仿真得到的性能曲線不能滿足使用要求,…

深度學習之 TensorRT

1 簡介 TensorRT是一個高性能的深度學習推理(Inference)優化器,可以為深度學習應用提供低延遲、高吞吐率的部署推理。TensorRT可用于對超大規模數據中心、嵌入式平臺或自動駕駛平臺進行推理加速。TensorRT現已能支持TensorFlow、Caffe、Mxne…

H.264筆記

H.264標準寫得比較繁復,所以考慮在瀏覽完Whitepaper之后就開始研讀X264代碼。X264代碼風格還是比較清晰簡潔的。根據對標準得理解,Picture Order Count在Slice解碼的一開始就被提及:I0 B1 B2 P3 B4 B5 P6I0 P3 B1 B2 P6 B4 B5于是I0的POC是0&…

進制轉換中dbho是什么意思_什么是網段?二進制十進制如何互相轉換?看完這篇,你就全明白了...

之前的文章講了ip,子網掩碼,網關的關系,今天著重講一下網段。我們用傻瓜交換機通訊時,一個網段的設備才能互相通訊,怎么能判斷兩個ip是同一個網段呢?今天就簡單的說一下。(這篇文章用語音聽可以起到催眠作用…