VLC Streaming


Sample commands of VLC as streaming server on windows 10. Client uses vlc.exe menu Media – Open Network Stream.
set VLC=D:\VLCPortable223\VLCPortable.exe
set MEDIA=Gym2017bshort.mp4
http:
Server: %VLC% –intf dummy –sout=#std{access=http,mux=ts,dst=0.0.0.0:8080} %MEDIA%
Client: http://localhost:8080
rtp: over udp
Server: %VLC% -vvv %MEDIA% –sout “#transcode{vcodec=h264,vb=0,scale=0,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{dst=127.0.0.1,port=8080,mux=ts,ttl=10}”
Client: rtp://@:8080
udp:
Server: %VLC% -vvv %MEDIA% –sout “#transcode{vcodec=h264,vb=0,scale=0,acodec=mpga,ab=128,channels=2,samplerate=44100}:std{access=udp,mux=ts,dst=127.0.0.1:8080}”
Client: udp://@:8080
rtsp:
Server: %VLC% -vvv %MEDIA% –sout “#transcode{vcodec=h264,vb=0,scale=0,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://127.0.0.1:8080/test}”
Client: rtsp://127.0.0.1:8080/test
multicast:
Server: %VLC% -vvv %MEDIA% –sout “#transcode{vcodec=h264,vb=0,scale=0,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{dst=239.255.12.42,port=8080,mux=ts,ttl=10}”
Client: rtp://239.255.12.42:8080
Remotely control server:
Start server: %VLC% –intf rc –rc-host 127.0.0.1:12345 –sout=#std{access=http,mux=ts,dst=0.0.0.0:8080}
Open command console: telnet localhost 12345
enter: add Gym2017bshort.mp4
Start client: http://localhost:8080
In telnet console, before reaching end of media, enter this command to seek media:
seek 1%

Advertisements

ICE STUN and TURN


Assuming host A B both behind NAT on the internet.
STUN: Session Traversal Utilities for NAT
A B talk to STUN server to know each other’s external IP and port state for hole punching.
The goal is to let A B directly talk to each other on UCP and sometimes TCP, if NAT is not symmetric.
This public IP is also needed in RTSP SDP when RTP over UDP.
STUN server itself communicates over UDP by default.
TURN: Traversal Using Relays around NAT
A first asks TURN server a permission, and then A sends all data to TURN, which is relayed to B.
Used for some NAT TCP, when hole punching doesn’t work.
ICE: Interactive Connectivity Establishment
Just a combination of STUN and TURN, and automatically switches between the two.

Vue on sale


Sony PlayStation Vue’s Core Plan is on sale for just $40, regular $50
and they have beautiful office locally in SF.

https://www.cordcuttersnews.com/playstation-vue-is-on-sale-ending-soon

Adaptive Streaming on Player Side


I beleive this is how the player switches from one resolution to another on HLS, but I have not found any documentation describing this process on the internet to verify.
First of all, simply switching from, e.g. HighRes0008.ts to LowRes0008.ts, doesn’t work.
1. Most often, HighRes0008.ts desn’t start with a IDR, which make descoding this segment impossible.
2. Even it starts with IDR, they may not be lined up on the frame level.
How the player switch:
1. In preparation to switch to lower resolution, player traces backward on the low resolution play list until it reaches an IDR.
2. based on the PTS on the high resolution playlist, it decides the PTS on the low resolution playlist, which is being switched to. Assuming the destination frame number ID is frame# 481.
3. decodes the low resolution playlist, from IDR to frame# 481, and renders that frame when time comes.
.ts segment contains PES, which in turn contains ES. The PTS is in the PES header.
PCR is only at the .ts layer, which I don’t think is needed in this use case, as long as PTS for audio and video are based on same PCR.
The same layer structure applies to audio too: TS – PES – ES (e.g. hold AAC data)