我使用NvEnc編碼實時H264流,我試圖通過RTP將它作爲「實況廣播」(實際上是多播)發送。事情目前工作正常,將h264轉儲到磁盤,甚至將flv寫入磁盤進行調試都可以正常工作。使用MPlayer觀看流時,發送原始UDP流也可以。至於流本身,它正在使用LOW_LATENCY預設,我只生成I幀和P幀(強制每隔60幀插入I幀以及SPS/PPS)。此外,NAL單元創建爲小於MTU大小減去RTP標頭長度。H264 over RTP video timing using single nal mode
現在,當我試圖通過RTP發送它時,我正在使用單個NAL模式(packetization-mode = 0),並且在計算rtp時間戳的外觀時遇到問題。我正在使用jrtplib來設置和使用RTP。
對於我從NvEnc獲得的每個編碼幀,我提取n個NAL單元,並且每個NAL單元都在它自己的RTP包中發送。我嘗試使用相同的rtp時間戳發送幀的所有NAL單元,並將下一幀的時間戳增加1500(90000 Hz/60 fps,因爲我有固定的60 fps輸入)流。我也嘗試測量幀n和幀n + 1之間花費的時間作爲時間戳的增量(無論如何大致爲1500)。 現在MPlayer仍然可以播放流,但VLCPlayer每隔幾秒都會重新緩衝,我認爲它與時間戳問題有關。我覺得MPlayer似乎更容忍濫用我身邊的東西。 欲瞭解更多信息,下面是我使用回放流(的一部分)的SDP設置:
m=video 24712 RTP/AVP 96
a=rtpmap:96 H264/90000
a=ftmp:96 packetization-mode=0
a=recvonly
我誤解的東西嗎?我試圖閱讀RFC,但無法自行解決這個問題。
所以問題是,當使用單一nal模式時,生成RTP時間戳的正確方法是什麼?
你是否在FLV中包含這些單一的NALU?如果您錄製10秒鐘然後使用像FFMpeg這樣的工具先將FLV轉換爲MP4,然後再將MP4轉換爲新的FLV,現在將您的舊FLV與FFMpeg中較新的FLV進行比較,會發生什麼情況。查看時間戳和CTTS偏移量。他們匹配嗎? –
FLV僅用於「離線調試」。當通過RTP /網絡發送時,我只發送NAL單元。我會試着看看你在上班時提到的時間戳。改變一些代碼後,VLC看起來更好,但仍不完美。 – pettersson