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 (real-time) yang berarti pengiriman diatur sesuai kecepatan bit rate dari frame tsb. Jika tidak diberikan opsi tsb maka streamer akan menyemprotkan paket-paket multicast udp secepat mungkin sesuai kapasitas speed dari network card di server.

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

Berikut adalah contoh yang digunakan operator TV Digital menggunakan ffmpeg sebagai realtime streamer untuk siaran "recoded live".


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

Berikut adalah penjelasan dari setiap bagian command tersebut:

  1. -re: Menginstruksikan FFmpeg untuk membaca input dalam kecepatan real-time. Berguna untuk streaming karena FFmpeg akan membaca file pada kecepatan yang sesuai dengan frame rate aslinya.

  2. -i [source]: Menentukan file input video bisa file MP4/AVI atau URL streaming yang ingin digunakan.

  3. -vcodec mpeg2video: Menetapkan codec video yang digunakan menjadi MPEG-2.

  4. Optinal -s 720x576: Menetapkan resolusi output video menjadi 720x576 piksel (resolusi standar untuk PAL 4:3). Jika file input berupa HD 16:9 maka parameter ini bisa di buang, jika diinginkan output resolusi tetap sesuai dengan resolusi file input 16:9.

  5. Optional -r 25: Mengatur frame rate video menjadi 25 frame per detik (fps). Ini juga standar untuk PAL. Jika file input berupa frame-rate 30 fps maka parameter ini bisa di buang, jika diinginkan output tetap 30 fps

  6. Optional -flags cgop+ilme:

    • cgop: Closed GOP (Group of Pictures), di mana setiap GOP memiliki frame I (keyframe) terpisah, membuat setiap segmen lebih independen dan lebih baik untuk penyiaran.
    • ilme: Mengaktifkan interlaced encoding, yang sering digunakan dalam penyiaran video untuk menangani gambar bergerak dengan lebih baik.
  7. Optional -sc_threshold 1000000000: Menentukan ambang batas deteksi adegan baru. Dengan nilai yang sangat tinggi, ini pada dasarnya menonaktifkan deteksi perubahan adegan, membuat frame I tidak dihasilkan secara otomatis pada adegan baru.

  8. -b:v 2M: Menetapkan bitrate video menjadi 2 Mbps (megabit per detik). Ini adalah bitrate tetap yang diinginkan untuk stream video.

  9. -minrate:v 2M, -maxrate:v 2M: Menetapkan laju bitrate minimum dan maksimum menjadi 2 Mbps, memastikan bitrate konstan.

  10. -bufsize:v 1.4M: Menetapkan ukuran buffer video menjadi 1.4 MB, yang mengontrol bagaimana data video di-buffer selama transmisi.

  11. -acodec mp2: Menetapkan codec audio menjadi MP2 (MPEG Audio Layer 2), yang umum digunakan dalam siaran.

  12. -ac 2: Mengatur output audio menjadi stereo (2 channel).

  13. -b:a 192k: Menetapkan bitrate audio menjadi 192 kbps.

  14. -f mpegts: Mengatur format output menjadi MPEG-TS (MPEG Transport Stream), yang cocok untuk penyiaran dan transmisi jaringan.

  15. udp://239.253.253.4:1234?pkt_size=1316:

  • udp://239.253.253.4:1234: Output stream melalui protokol UDP ke alamat multicast 239.253.253.4 pada port 1234.
  • ?pkt_size=1316: Mengatur ukuran paket UDP menjadi 1316 byte. Ukuran ini sering digunakan dalam transmisi jaringan untuk memastikan paket video dan audio optimal.

Jadi, perintah ini memproses file video atau sumber stream dan mentransmisikannya sebagai stream MPEG-TS melalui jaringan multicast UDP dengan spesifikasi video MPEG-2 pada resolusi 720x576, frame rate 25 fps, bitrate konstan 2 Mbps, dan audio MP2 stereo pada bitrate 192 kbps.


No comments: