=================================================================
音視頻入門基礎:MPEG2-TS專題系列文章:
音視頻入門基礎:MPEG2-TS專題(1)——MPEG2-TS官方文檔下載
音視頻入門基礎:MPEG2-TS專題(2)——使用FFmpeg命令生成ts文件
音視頻入門基礎:MPEG2-TS專題(3)——TS Header簡介
音視頻入門基礎:MPEG2-TS專題(4)——使用工具分析MPEG2-TS傳輸流
音視頻入門基礎:MPEG2-TS專題(5)——FFmpeg源碼中,判斷某文件是否為TS文件的實現
音視頻入門基礎:MPEG2-TS專題(6)——FFmpeg源碼中,獲取MPEG2-TS傳輸流每個transport packet長度的實現
音視頻入門基礎:MPEG2-TS專題(7)——FFmpeg源碼中,讀取出一個transport packet數據的實現
音視頻入門基礎:MPEG2-TS專題(8)——TS Header中的適配域
音視頻入門基礎:MPEG2-TS專題(9)——FFmpeg源碼中,解碼TS Header的實現
音視頻入門基礎:MPEG2-TS專題(10)——PSI、SI簡介
音視頻入門基礎:MPEG2-TS專題(11)—— TS中的Section
音視頻入門基礎:MPEG2-TS專題(12)—— FFmpeg源碼中,把各個transport packet組合成一個Section的實現
音視頻入門基礎:MPEG2-TS專題(13)——FFmpeg源碼中,解析Section Header的實現
音視頻入門基礎:MPEG2-TS專題(14)——PAT簡介
音視頻入門基礎:MPEG2-TS專題(15)——FFmpeg源碼中,解析Program association section的實現
音視頻入門基礎:MPEG2-TS專題(16)——PMT簡介
音視頻入門基礎:MPEG2-TS專題(17)——FFmpeg源碼中,解析TS program map section的實現
音視頻入門基礎:MPEG2-TS專題(18)——PES流簡介
音視頻入門基礎:MPEG2-TS專題(19)——FFmpeg源碼中,解析TS流中的PES流的實現
音視頻入門基礎:MPEG2-TS專題(20)——ES流簡介
音視頻入門基礎:MPEG2-TS專題(21)——FFmpeg源碼中,獲取TS流的視頻信息的實現
音視頻入門基礎:MPEG2-TS專題(22)——FFmpeg源碼中,獲取TS流的音頻信息的實現
音視頻入門基礎:MPEG2-TS專題(23)——通過FFprobe顯示TS流每個packet的信息
音視頻入門基礎:MPEG2-TS專題(24)——FFmpeg源碼中,顯示TS流每個packet的pts、dts的實現
音視頻入門基礎:MPEG2-TS專題(25)——通過FFmpeg命令使用UDP發送TS流
音視頻入門基礎:MPEG2-TS專題(26)——通過FFmpeg命令使用RTP發送TS流
=================================================================
一、通過FFmpeg命令使用RTP發送TS流
通過以下FFmpeg命令可以將一個mp4文件轉換為ts流,并通過RTP協議對TS包進行封裝發送(推流):
ffmpeg.exe -re -i input.mp4 -vcodec copy -acodec copy -f rtp_mpegts rtp://127.0.0.1:1234
其中:
“input.mp4”為輸入(轉換前)的媒體文件。
參數“-c:v copy -c:a copy”用于保持視頻和音頻的編碼格式不變,只復制音視頻流而不對其重新進行編解碼。
“1234”為接收端需要創建的UDP服務器的端口號,推流端使用基于UDP的RTP將TS流發送到接收端的該端口。
二、接收端播放
通過命令:ffplay -protocol_whitelist "file,udp,rtp" -i rtp://127.0.0.1:1234?可以播放上述生成的RTP封裝的TS流:
三、Wireshark抓包分析
通過Wireshark可以抓取上述生成的RTP封裝的TS流。顯示過濾器輸入“rtp && !icmp”,使得Wireshark只顯示RTP協議并把ICMP協議排除掉。這樣界面就能只顯示上述生成的RTP包裝的TS流的數據包了:
(一)RTP header分析
選中其中一個RTP數據包(RTP packet),下圖紅框中顯示的就是其RTP header(關于RTP header的格式可以參考:《音視頻入門基礎:RTP專題(7)——RTP協議簡介》):
從上圖中可以看到該RTP數據包的RTP header的payload type值為33,所以可以確定其RTP payload中存放的是MP2T,即MPEG2-TS格式的數據:
(二)TS Header分析
展開ISO/IEC 13818-1這一層(《ISO IEC 13818-1》是MPEG2-TS的官方文檔),下圖紅框中顯示的是該RTP包里面某個TS包(transport packet)的TS Header的信息(關于RTP header的格式可以參考:《音視頻入門基礎:MPEG2-TS專題(3)——TS Header簡介》):
從上圖中可以看到該TS包的TS Header的PID屬性的值為0x0000,所以該TS包的payload為Program association table ,即?PAT表(具體可以參考:《音視頻入門基礎:MPEG2-TS專題(14)——PAT簡介》)。通過Wireshark抓包可以看到,TS流會周期發送PAT信息。
(三)PAT表分析
展開PAT表(Program association table),可以看到其program_number為0x0001(即1),表示該TS流中有一個節目號為“1”的節目;program_map_PID為0x1000,表示要想獲取這個節目的詳細信息,就要去解析PID值為0x1000的PMT表(關于PMT表具體可以參考:《音視頻入門基礎:MPEG2-TS專題(16)——PMT簡介》):
(四)PMT表分析
PID值為0x1000的PMT表如下。可以看到該PMT表中program_number為0x0001(即1),表示這是一個節目號為“1”的節目。該節目中有兩個媒體流。第一個媒體流stream_type的值為0x1B,表示是H.264視頻流,elementary_PID為0x100,所以該節目視頻的PID為0x100;第二個媒體流stream_type的值為0x0F,表示是AAC音頻流,elementary_PID為0x101,所以該節目音頻的PID為0x101:
通過PMT表找到PID為0x100的視頻流如下:
通過PMT表找到PID為0x101的音頻流如下:
四、使用RTP發送TS流的優點
跟《音視頻入門基礎:MPEG2-TS專題(25)——通過FFmpeg命令使用UDP發送TS流》的方法相比,使用RTP發送TS流的優點在于:RTP header中有一個占16位的序列號(sequence number),接收方可利用序列號檢測數據包丟失并恢復數據包序列(接收端一般使用擴展序列號,見《音視頻入門基礎:RTP專題(7)——RTP協議簡介》)。TS Header中雖然也有一個占4位的連續性計數器(continuity_counter)用于檢查同一個PID的TS包(transport packet)的連續性,可以判斷TS包是否連續以及丟失,但是continuity_counter只占4位,不夠長,這就可能導致接收端無法正確排列 TS數據包,從而導致轉儲TS的播放損壞。