天天看點

使用live555 VLC發送接收視訊TS流

本文内容如下:

如何使用VLC作為Server發送視訊TS流,

如何使用live555發送接收TS流

VLC發送TS流

VLC發送接收TS指令

通常可以使用下述四種方式

1. UDP

2. RTP

3. RTSP

4. HTTP

同時附帶在加入轉碼後的實作方式

UDP方式

Server(10.22.76.56)配置

此處)折疊或打開

  1. vlc test.ts --sout "#standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=10.22.76.103:3940}" --sout-all --sout-keep --loop

如此,我們就實作

1. 使用指定的pid(video,audio,pmt等的pid)

2. 往指定的Dst:Port(10.22.76.103:3940)

3. 推送指定的視訊流 test.ts

在server推送這個視訊流後,client(10.22.76.103)使用command:

此處)折疊或打開

  1. vlc udp://@:3940
  2. 或者
  3. ://@10.22.76.103:3940

來進行視訊的播放

以上的 server配置中,Server本地并不會播放視訊,僅僅是推送TS,如果要實作在 Server本地播放,可以使用

此處)折疊或打開

  1. vlc test.ts --sout "#duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.56:3940}}" --sout-all --sout-keep --loop

從中對比可以看出,如果需要本地播放,隻是在sout中多添加了幾個option的配置而已

--sout "#

duplicate{dst=display,dst=

standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.56:3940}}

"

其中,綠色表示單純往Dst:port推送TS

藍色表示如果要在本地播放,除去需要推送的dst外,還需要在本地display

如果Server推送的TS還有轉碼的需求,類似上述的擴充,可以使用

此處)折疊或打開

  1. vlc test.ts --sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.56:3940}}" --sout-all --sout-keep --loop

從中可以看出,對于轉碼的需求,也僅僅是添加了藍色的一段options而已

--sout "#

transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.56:3940}

}

"

對于轉碼,有音頻和視訊不同類似的轉碼方式,組合後其方式會更多,具體的可以使用VLC的UI配置方式,在選擇不同的轉碼方式後,來檢視對應生成的command有何不同,在此僅僅列舉其中的幾種:

 Video - H.264 + MP3 (MP4)

 vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100

 Video - H.264 + MP3 (TS)

 vcodec=h264,vb=800,acodec=mpga,ab=128,channels=2,samplerate=44100

 Audio - MP3 (MP4)

 vcodec=none,acodec=mpga,ab=128,channels=2,samplerate=44100

 Video for MPEG4 1080p TV/device

 vcodec=h264,vb=3500,width=1920,height=1080,acodec=mp3,ab=192,channels=2,samplerate=44100

需要注意:

1. 使用轉碼後,從測試效果來看,通常會出現馬賽克。是因為轉碼需要消耗一定的cpu資源導緻?

2. 使用UDP等方式推送的TS,Client在接收時候需要" vlc udp://@:3940", "vlc udp://@10.22.76.103:3940" 中需要加上 "@"。在後續使用TCP的 RTSP和HTTP中,可以不用加上@

對于Client的接收方式,以上server不同的推送方式下,都是一樣的

RTP方式

Server(10.22.76.56)配置

此處)折疊或打開

  1. vlc test.ts --sout "#rtp{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},dst=172.22.102.55,port=3940}" --sout-all --sout-keep --loop
  2. test.ts --sout "#rtp{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.55,port=3940}" --sout-all --sout-keep --loop

其中,Access方式設定與否都可以。

在server推送這個視訊流後,client(10.22.76.103)使用command:

此處)折疊或打開

  1. vlc rtp://@10.22.76.103:3940
  2. 或者
  3. ://@:3940

對于需要在本地顯示和需要使用轉碼的,可以采用:

此處)折疊或打開

  1. vlc test.ts --sout "#duplicate{dst=display, dst=rtp{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},dst=10.22.76.55,port=3940}}" --sout-all --sout-keep --loop
  2. test.ts --sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display, dst=rtp{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},dst=10.22.76.55,port=3940}}" --sout-all --sout-keep --loop

注意點:

1. 在使用rtp方式時候,dst=後面使用的是 rtp,而不在是預設udp的 standard

2. 其中對于Port的指定,不再像UDP或者其他方式一樣,使用Ip:Port,而是使用"dst=Ip,port=port1"的方式

RTSP方式

Server(10.22.76.56)配置

此處)折疊或打開

  1. vlc test.ts --sout "#rtp{sdp=rtsp://:8554/test1}"

在server推送這個視訊流後,client(10.22.76.103)使用command:

此處)折疊或打開

  1. vlc rtsp://10.22.76.56:8554/test1

對于RTSP或者以下的HTTP方式下,和上述UDP/RTP推送方式有些不同:

1. 使用UDP方式下,Server會将TS流推送到制定的 Client,是以,server和client應該是能互相通信的。是以Client隻需要在本地從本地網卡接收TS就可以了,是以可以省略Ip

2. 使用Http方式下,Server是将TS流推送到本地的網卡上(嚴格來說資料還沒有真實發送給網卡,隻是在網卡的特定Port上偵聽Client的連接配接),Client需要使用TCP來連接配接Server(使用制定的Ip和Port),在建立tcp連接配接後,server會将TS推送給Client。是以Server可以省略Ip,但是Client必須制定server的Ip和Port

對于需要在本地顯示和轉碼的,可以參考:

此處)折疊或打開

  1. vlc test.ts --sout "#duplicate{dst=display, dst=rtp{sdp=rtsp://:8554/test1}}"
  2. test.ts --sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display, dst=rtp{sdp=rtsp://:8554/test1}}"

注意點:

1. 在這種模式下,Client的接收方式和之前的UDP方式不同。可以是"vlc rtsp://@IP" 或者是 "vlc rtsp://IP"的方式,@是可選的

2. Server在推送時候,會需要在Port後添加目錄,比如上述的"/test1"。自然client在接收時候也需要指定

3. 如果Server在推送時候,省略了Ip的指定,則該Server上所有的Interface上,都能接收Client的請求

HTTP方式

Server(10.22.76.56)配置

此處)折疊或打開

  1. vlc test.ts --sout "#standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=http,dst=10.22.76.56:3940}" --sout-all --sout-keep --loop

在server推送這個視訊流後,client(10.22.76.103)使用command:

此處)折疊或打開

  1. vlc http://10.22.76.56:3940

同樣,對于有在本地顯示和轉碼需求的,可以參考:

此處)折疊或打開

  1. vlc test.ts --sout "#duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=http,dst=10.22.76.56:3940}}" --sout-all --sout-keep --loop
  2. test.ts --sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=http,dst=10.22.76.56:3940}}" --sout-all --sout-keep --loop

-----------------------參考資料------------------------

live555發送接收TS流

該部分内容有待更新