Saturday, May 16, 2015

Script FFMPEG Untuk HLS

HLS (HTTP Live Streaming) di buat oleh Apple. Dan saat ini menjadi "de facto" protokol streaming untuk hampir semua device (PC, MAC, Android, iOS, Windows Phone).

Kekuatan HLS adalah: sederhana. Tidak diperlukan Streaming server, tapi cukup HTTP Server.

HLS bekerja dengan me-transcode file source menjadi file dengan container .TS (Transpor Stream). Codec yang digunakan harus H264 dan AAC.

Script ffmpeg berikut untuk menghasilkan file-file chunk MPEGTS (MPEG Transport Stream) dengan extensi .TS:

Membuat file TS bitrate 256kbps

ffmpeg -i SOURCE_VIDEO -vcodec libx264 -acodec libvo_aacenc -b:v 256k -s:v 426x240 -pix_fmt yuv420p -r 25 -flags -global_header -map 0:0 -map 0:1 -f segment -segment_time 4 -segment_list_size 0 -segment_list PATH_256/list.m3u8 -segment_format mpegts PATH_256/stream%d.ts

Output:
satu file Path_256/list.m3u8
beberapa file .TS

Sejauh ini proses membuat file untuk diplay secara HLS sudah selesai. File-file .TS dan file list.m3u8 tinggal di letakkan di Web Server. Semua player yang bisa play HLS tinggal memanggil URL HTTP ke file list.m3u8

Copy paste URL ini di VLC player: http://multimedia-howto.hol.es/256/list.m3u8.

Bagaimana dengan Adaptive Bitrate HLS?

Kekuatan kedua HLS adalah sudah support Adaptive Bitrate. Sebenarnya playerlah yang pintar untuk memeriksa kualitas bandwidth yang tersedia, lalu memilih file m3u8 dengan bitrate yang diinginkan.

Seandainya kita ingin membuat 2 bitrate (256kbps dan 512 kbps), maka proses nya sama seperti sebelumnya.

Membuat file TS bitrate 512kbps


ffmpeg -i SOURCE_VIDEO -vcodec libx264 -acodec libvo_aacenc -b:v 512k -s:v 426x240 -pix_fmt yuv420p -r 25 -flags -global_header -map 0:0 -map 0:1 -f segment -segment_time 4 -segment_list_size 0 -segment_list PATH_512/list.m3u8 -segment_format mpegts PATH_512/stream%d.ts

Output:
file Path_512/list.m3u8
beberapa file .TS

Setelah terbentuk 2 file m3u8 yaitu Path_256/list.m3u8 dan Path_512/list.m3u8 selanjutnya perlu dibuat 1 file yang menggabungkan ke dua file m3u8 tsb.

Buat sebuah file index.m3u8
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=256000
256/list.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=512000
512/list.m3u8

Semua file yang dibutuhkan untuk Adaptive Bitrate HLS selesai dibuat.

Copy paste URL HLS Adaptive Bitrate berukut ini di VLC player: http://multimedia-howto.hol.es/index.m3u8

Catatan: Proses di FFMPEG

1. Semua option sebelum SOURCE_VIDEO (spt -i) applied untuk input. Sisanya adalah option untuk Output File (-r 25, artinya output file jadikan 25 fps).

2. Apabila bit-rate, fps, dll di set, maka akan terjadi proses transcoding (file input akan di baca lalu di encoding ulang).

3. Apabila tetap menggunakan codec yang sama, maka di set -vcodec copy dan -acodec copy
transcoding akan tetap terjadi (walau codec yang digunakan sama) apabila parameter bandwidth dan resolusi di set.

Update Dec-2105:
Opsi lain untuk membuat HLS dengan pertimbangan:
1. Closed GOP, GOP 2x framerate, Keyframe sama dengan GOP, scenecut 0
2. Consecutive B-frame: 2 (PBBPBBP...)
3. HLS time: 10 second (target chunk)
4. HLS list size: 0 (artinya m3u8 yang di produksi sesuaikan dengan semua chunk yang terbentuk)
5. HLS wrap:0 (artinya file .ts yang terbentu tidak di wrap, tuliskan semua file .ts)
6. Start Number: chunk yang terbentuk dimulai dengan nomer-1
7. Length dan jumlah file .ts yang di generate di semua profile identik (jumlah dan durationnya)

240p
ffmpeg -i SOURCE-VIDEO -y -acodec libvo_aacenc -vcodec libx264 -b:v 256k -s:v 426x240 -pix_fmt yuv420p -r 25 -g 50 -keyint_min 50 -sc_threshold 0 -bf 2 -f hls -hls_time 10 -hls_list_size 0 -hls_wrap 0 -start_number 1 -hls_segment_filename 256k240p\v256k240p%03d.ts 256k240p\v256k240p.m3u8

480p
ffmpeg -i SOURCE-VIDEO -y -acodec libvo_aacenc -vcodec libx264 -b:v 768k -s:v 854x480 -pix_fmt yuv420p -r 25 -g 50 -keyint_min 50 -sc_threshold 0 -bf 2 -f hls -hls_time 10 -hls_list_size 0 -hls_wrap 0 -start_number 1 -hls_segment_filename 768k480p\v768k480p%03d.ts 768k480p\v768k480p.m3u8

Catatan:
1. Apabila digunakan option -preset ultrafast, maka file size sama, encoders selesai sangat cepat (1/4 duration video), namun tidak ada B-frame yang terbentuk, sehingga hasil video jadi choppy. Sedangkan option -preset veryslow memberikan kualitas video yang terbaik tetapi proses transcoding berlangsung sama dengan duration vidio.

2. Option -y untuk mengoverwrite file .ts dan .m3u8 yang terbentuk

3. Perbedaan profile akan menggunakan nama_file.ts yang berbeda untuk timeline yang sama. Hal ini untuk menghidari satu file saling tumpang tindih (jika nama file dibuat sama untuk profile yang berbeda).

4. Dapat juga digunakan option moovflags untuk memindahkan header movie tiap chunk ke depan (awal file) -movflags +faststart

Source:
https://developer.apple.com/streaming/
http://api.encoding.com/HLSproStreams/
http://www.adobe.com/devnet/devices/articles/mobile_video_encoding.html?PID=3662453
https://sonnati.wordpress.com/2011/08/19/ffmpeg-%E2%80%93-the-swiss-army-knife-of-internet-streaming-%E2%80%93-part-iii/
http://superuser.com/questions/866798/what-ffmpeg-command-line-matches-the-one-youtube-uses




2 comments:

Robby Haryanto said...

mau tanya gan, gimana cara pakai codec H264 dan AAC, karena saat di excute muncul error "Unknown encoder 'libvo_aacenc"

Eben said...

Saya mau tanya...
Apa ada script untuk edit video agar di setiap beberapa frame terjadi zoom
Jadi tidak cape edit manual