Friday, May 22, 2015

FFMPEG Sebagai Streamer UDP

FFMPEG dapat menjadi origin server dengan menjadi streamer membroadcast sebuah file (atau disebut simulated live).

Penerima dapat sebuah terminal akhir sepertin PC Client dengan player VLC, Smartphone dengan player MX-Player, atau Streaming Server spt Wowza (edge server, atau CDN server).

Karena bersifat broadcast, streaming perlu diangkut pakai Transport Stream TS.

Paket-paket TS diangkut dapat menggunakan UDP atau RTP

UDP: [ TS --> UDP --> IP ]

RTP: [ TS --> RTP --> UDP --> IP ] <-- dibahas pada bagian khusus

Destination Multicast (banyak penerima)

ffmpeg.exe -i VIDEO.flv -vcodec libx264 -acodec libvo_aacenc -f mpegts udp://239.101.101.1:1234

Jika router (Wifi AP) memblok multicast, maka bisa dicoba streaming UDP ke IP Unicast

Destination Unicast (1 penerima)
(PC / Smartphone penerima IPnya 192.168.1.104):
ffmpeg.exe -i VIDEO.flv -vcodec libx264 -acodec libvo_aacenc -f mpegts udp://192.168.1.104:1234  

Apabila disisi penerima (player) tidak bisa buffering (atau simpan ke file), maka Streamer harus mensimulasikan pengiriman secara live: tambahkan option -re 

Live Simlated Streaming
ffmpeg.exe -re -i VIDEO.flv -vcodec libx264 -acodec libvo_aacenc -f mpegts udp://192.168.1.104:1234


Terkadang sering didapat bahwa player disisi client play video berwarna hijau. Ini terjadi karena file video memiliki i-Frame (KeyFrame) biasanya setiap 10 detik. Artinya setiap 10 detik barulah player mendapatkan i-Frame (gambar utuh).

Agar player tidak harus menunggu 10 detik agar sync kembali (karena dapat frame/gambar utuh), maka berikut adalah command untuk memaksa ffmpeg melakukan transcoding dengan meng-insert i-Frame tiap 3 detik (tapi efeknya kebutuhan bandwidth meningkat, karena ada tambahan 2 frame tiap 10 detik).


Force to Create KeyFrame tiap 3 detik
ffmpeg.exe -re -i VIDEO.flv -vcodec libx264 -acodec libvo_aacenc -force_key_frames "expr:gte(t,n_forced*3)" -f mpegts udp://192.168.1.104:1234   

Frame Time in Seconds
(t)
Expression, based on
gte(t,n_forced*3)
Evaluates as Keyframes forced so far
(n_forced)
1 0 If 0 >= 0*3 TRUE – force keyframe 1
2 0 If 0 >= 1*3 FALSE 1
3 1 If 1 >= 1*3 FALSE 1
4 1 If 1 >= 1*3 FALSE 1
5 2 If 2 >= 1*3 FALSE 1
6 2 If 2 >= 1*3 FALSE 1
7 3 If 3 >= 1*3 TRUE – force keyframe 2
8 3 If 3 >= 2*3 FALSE 2
9 4 If 4 >= 2*3 FALSE 2
10 4 If 4 >= 2*3 FALSE 2
11 5 If 5 >= 2*3 FALSE 2
12 5 If 5 > 2*3 FALSE 2
13 6 If 6 >= 2*3 TRUE – force keyframe 3
14 6 If 6 >= 3*3 FALSE 3
15 7 If 7 >= 3*3 FALSE 3
16 7 If 7 >= 3*3 FALSE 3
17 8 If 8 >= 3*3 FALSE 3
18 8 If 8 >= 3*3 FALSE 3
19 9 If 9 >= 3*3 TRUE – force keyframe 4

FFMPEG transmit ke DVB-T Endocer

ffmpeg -re -i [source] -vcodec mpeg2video -s 720x576 -r 25 -flags cgop+ilme -sc_threshold 1000000000 -b:v 2M -minrate:v 2M -maxrate:v 2M -bufsize:v 1.4M -acodec mp2 -ac 2 -b:a 192k -f mpegts udp://239.253.253.4:1234?pkt_size=1316

No comments: