Living life and Make it Better

life, learn, contribute

Endy Muhardin

Software Developer berdomisili di Jabodetabek, berkutat di lingkungan open source, terutama Java dan Linux.

Live Streaming dengan Nginx RTMP Module

Di era milenial seperti sekarang ini, segala kegiatan harus dipublish supaya eksis. Gak cukup dengan posting foto dan rekaman video, harus instan real time live show. Para raksasa sosmed berlomba-lomba menyediakan fasilitas tayangan langsung seperti Instagram Stories, Facebook Live, Youtube Live, dan masih banyak yang lainnya.

Karena banyak platform berbeda, tapi tujuannya sama, maka sayapun mencari aplikasi untuk membantu publikasi untuk melakukan tayangan langsung. Pengennya satu kali pasang kamera, langsung live di berbagai sosmed. Cari punya cari, ada beberapa alternatif untuk mengabstraksi tayangan langsung multi platform ini:

Pada artikel kali ini, kita akan membahas setup Nginx RTMP Module dengan Raspberry Pi.

Raspi Resource Usage

Nginx RTMP Module merupakan tambahan modul di atas webserver Nginx yang sudah terkenal itu. Saya pilih ini karena setupnya yang relatif mudah dan kebutuhan resourcenya yang minim. Bila kita tidak melakukan transcoding (mengubah resolusi misalnya dari 4k menjadi 1080p, 720p, dsb), maka perangkat sekelas Raspberry Pi sudah cukup. Tanpa transcoding, berarti tugasnya dia hanya menerima aliran data streaming dan meneruskannya ke berbagai platform yang kita tentukan (Facebook, Youtube).

Seperti bisa kita lihat pada screenshot di atas, pada saat streaming ke Facebook dan YouTube sekaligus, pemakaian CPU hanya 2% dan RAM hanya 0.4%.

Ada beberapa langkah setupnya, yaitu:

  1. Instalasi Raspbian di Raspberry Pi.
  2. Kompilasi Nginx dan Modul RTMP
  3. Konfigurasi upstream
  4. Mulai live streaming

Instalasi Raspbian

Instalasi Raspberry Pi sudah pernah saya bahas dalam artikel sebelumnya. Jadi tidak akan kita bahas lagi di sini.

Sebetulnya pakai Linux apa saja bisa, tidak harus Debian, Ubuntu, ataupun distro tertentu. Instalasinya juga tidak harus di Raspberry Pi. Bisa juga di PC biasa ataupun VPS seperti Digital Ocean.

Kompilasi Nginx dan Modul RTMP

Kita perlu mengunduh source code Nginx. Lakukan perintah berikut di command line.

wget http://nginx.org/download/nginx-1.15.6.tar.gz

Versi Nginx silahkan disesuaikan dengan yang terbaru. Pada saat artikel ini ditulis, yang terbaru adalah 1.15.6.

Kemudian, kita unduh juga source code rtmp-module.

wget https://github.com/sergey-dryabzhinsky/nginx-rtmp-module/archive/dev.zip

Kita extract keduanya

tar zxvf nginx-1.15.6.tar.gz
unzip dev.zip

Untuk melakukan kompilasi, kita membutuhkan kompiler bahasa C/C++ dan perlengkapan tambahannya. Di keluarga Debian sudah disediakan paketnya, bernama build-essentials. Kita install bersama beberapa library tambahan

sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev -y

Sekarang kita sudah bisa melakukan kompilasi. Masuk ke folder source code Nginx dan lakukan kompilasi

./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-dev
make
sudo make install

Bila tidak ada pesan error, maka instalasi berhasil. Nginx akan terinstal di /usr/local/nginx. Kita bisa jalankan dengan perintah berikut

sudo /usr/local/nginx/sbin/nginx

Kemudian kita test dengan browse ke http://<ip-server-raspberry>/. Seharusnya kita akan melihat layar selamat datang Nginx.

Welcome Nginx

Konfigurasi Youtube

Ada dua tujuan live streaming yang populer, yaitu Youtube dan Facebook.

Kita akan setup Youtube dulu. Login ke Youtube, kemudian buka halaman setting Live Streaming.

Youtube Live Streaming Page

Ada dua pilihan metode streaming di Youtube, yaitu Live Streaming dan Event. Bila kita mau spontan tayang, maka kita bisa gunakan Live Streaming. Langsung saja copy Server URL dan Stream name/key dan pasang di aplikasi broadcaster kita.

Bila sesi livenya terjadwal, kita bisa menggunakan Event. Di menu Event, kita bisa mengatur sesi live dengan lebih baik, misalnya kita bisa jadwalkan terlebih dulu sehingga para subscriber kita bisa menyiapkan waktu untuk menonton.

Create Event

Untuk membuat Event, kita klik tab Event di kiri. Kemudian isi nama event dan waktu tayang. Begitu kita klik Create Event, subscriber kita akan diberikan notifikasi.

Selanjutnya, kita akan menentukan setting bitrate dan resolusi. Semakin besar bitrate/resolusi, semakin baik kualitas audio dan video. Tapi bandwidth yang dibutuhkan juga semakin besar. Biasanya saya menggunakan 480p saja untuk acara training/seminar/diskusi. Untuk jenis event seperti ini, kualitas audio jauh lebih penting daripada gambar.

Pilihan Resolusi

Bila resolusi yang kita inginkan tidak ada, maka kita bisa membuat yang baru. Cukup create event, lalu pilih resolusi yang ingin kita gunakan.

Membuat resolusi baru

Setelah kita memilih resolusi, kita akan diberikan setting untuk aplikasi encoder/broadcaster. Sama seperti sebelumnya, kita butuh nilai Stream URL dan Stream Name/Key.

Setting Encoder

Stream URL Youtube biasanya adalah rtmp://a.rtmp.youtube.com/live2/

Preview Streaming

Berikutnya, kita akan disajikan layar persiapan event. Di sini kita bisa mulai menyalakan aplikasi encoder kita. Hasilnya akan tampil di halaman tersebut. Kita bisa mengetes kualitas streaming kita di layar ini. Pada titik ini, tayangan kita belum dipublish secara umum. Hanya kita yang bisa melihatnya.

Setelah kita puas dengan kualitas video tayangan, kita bisa klik Start Streaming. Barulah event live kita akan bisa dilihat orang banyak.

Konfigurasi Facebook

Di Facebook, kita bisa langsung pergi ke halaman Create Live Stream. Klik tombol Create, dan kemudian kita akan masuk ke halaman persiapan live streaming

Persiapan Live Streaming

Seperti biasa, kita butuh Stream URL dan Stream Key. Kita juga perlu mengisi judul dan deskripsi acara. Settingan privasi tayangan juga bisa diatur.

Konfigurasi Encoder

Stream URL Facebook biasanya adalah rtmp://live-api-s.facebook.com:80/rtmp/

Konfigurasi Nginx RTMP Module

Dengan Nginx RTMP Module, kita bisa mempublikasikan stream kita ke banyak tujuan. Di artikel ini, kita akan gunakan dua saja, yaitu Youtube dan Facebook. Konfigurasinya sebagai berikut, ditulis di file /usr/local/nginx/conf/nginx.conf

rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp {
  server {
    listen 1935;
    chunk_size 4096;
    application live {
      live on;
      record off;
      allow publish 127.0.0.1;
      deny publish all;
      push rtmp://a.rtmp.youtube.com/live2/abcd-abcd-abcd-abcd;
      push rtmp://live-api-s.facebook.com:80/rtmp/12345678909876543?s_ps=9&s_sw=9&s_vt=abc-d&a=QwertYasDf321Hjk
    }
  }
}

Tujuan stream kita ada di baris yang ada perintah push. Formatnya adalah push rtmp://<stream-url>/<stream-key>

Nilai ini kita dapatkan dari konfigurasi YouTube dan Facebook di atas.

Kita juga perlu membatasi alamat IP aplikasi yang boleh stream ke sana. Bila tidak dibatasi, maka orang lain bisa publish ke sana dan tayang di channel YouTube kita dan timeline Facebook kita. Tentu ini tidak kita inginkan. Pembatasannya ada di baris berikut:

  • allow publish <ip-yang-boleh-publish>
  • deny publish all

Bila kita ingin melakukan transcoding, misalnya mengubah stream yang resolusi awalnya 1080p menjadi 360p, kita bisa jalankan konversi dengan ffmpeg atau avconv. Tambahkan perintah exec sebagai berikut

application live {
    live on;
    record off;
    exec ffmpeg -i rtmp://localhost/live/$name -threads 1 -c:v libx264 -profile:v baseline -b:v 350K -s 640x360 -f flv -c:a aac -ac 1 -strict -2 -b:a 56k rtmp://localhost/live360p/$name;
}

Kemudian url rtmp://localhost/live360p/$name tersebut kita publish ulang sebagai berikut

application live360p {
    live on;
    record off;
}

Untuk mengubah bitrate video, ubah nilai setelah -b:v. Kualitas audio bisa disesuaikan dengan nilai setelah opsi -b:a. Resolusi diubah dengan opsi -s.

Dengan kombinasi opsi tersebut, kita bisa mempublikasikan tayangan kita dalam beberapa pilihan resolusi dan kualitas. Jadi penonton yang menggunakan smartphone bisa memilih resolusi kecil, dan penonton di rumah dengan TV layar lebar bisa memilih resolusi maksimal.

Sebelum dijalankan, test dulu konfigurasi kita dengan perintah berikut

sudo /usr/local/nginx/sbin/nginx -t

Bila tidak ada error, kita bisa start dengan perintah berikut

sudo /usr/local/nginx/sbin/nginx

Untuk menyetop Nginx, kita jalankan perintah berikut

sudo /usr/local/nginx/sbin/nginx -s stop

Bila sudah oke, kita bisa daftarkan dia menjadi systemd service supaya otomatis hidup pada waktu komputer dinyalakan/direstart. Buat konfigurasi di file /etc/systemd/system/nginx.service

[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

Untuk menyalakan service, jalankan perintah berikut

sudo systemctl start nginx.service

Supaya dia jalan otomatis tiap komputer dinyalakan, kita enable servicenya.

systemctl enable nginx.service

Konfigurasi Streaming OBS

OBS (Open Broadcaster Software) Project adalah aplikasi encoder/broadcaster open source yang sudah terbukti kehandalannya. Aplikasi ini sudah amat cukup untuk melakukan live streaming.

Layanan OBS

Di antara fiturnya adalah:

  • Bisa streaming ke Youtube, Facebook, dan lainnya
  • Bisa multiple input (kamera, audio, capture aplikasi, gambar/foto, video, tulisan, dan sebagainya)
  • dan banyak lainnya

Saking banyak dan lengkap fiturnya, perlu satu artikel khusus untuk membahas OBS. Sedangkan di sini kita mau fokus membahas live streaming.

Walaupun demikian, ada satu keterbatasan OBS, yaitu dia hanya bisa broadcast ke satu tujuan. Tidak bisa misalnya ke Youtube dan Facebook sekaligus. Bila kita ingin melakukan broadcast ke beberapa tujuan seperti gambar di bawah, kita harus pakai aplikasi lain seperti misalnya Vmix atau menggunakan layanan cloud seperti reStream, SwitchBoard, atau lainnya.

Direct Streaming

Untuk itu, kita akan menggunakan relay server dengan Nginx yang sudah kita setup di atas. Sehingga topologinya menjadi seperti ini

Nginx RTMP Streaming

Untuk menghubungkan OBS dengan Nginx, masuk ke menu Settings, kemudian masuk ke menu Stream. Kita bisa pasang Stream URL dan Stream Key di sana.

Konfigurasi Stream OBS

Kita masukkan nilai berikut:

  • Stream URL : rtmp://<ip-address-nginx-server>/live
  • Stream Key : masukkan nilai apa saja, bebas. Misalnya kita berikan key coba-coba-streaming

Setelah itu kita bisa mulai streaming dengan menekan tombol Start Streaming.

Test Streaming

Nginx RTMP Module selain mempublish tayangan kita ke tujuan yang disebutkan dalam konfigurasi push, juga akan menyediakan URL streaming langsung. URL ini nantinya bisa digunakan orang lain yang ingin me-relay tayangan kita. Kita juga bisa gunakan URL ini untuk mengetes tayangan kita menggunakan aplikasi VLC Player yang gratis dan open source.

Masuk ke menu File > Open Network, lalu masukkan URL rtmp://<ip-nginx-rtmp>/live/<stream-key> seperti screenshot berikut

VLC Open Stream

Seharusnya kita bisa menonton live streaming yang dikirim oleh OBS.

VLC View Stream

Penutup

Live Streaming merupakan fasilitas jaman now yang sangat bermanfaat. Layanannya gratis, setupnya tidak sulit, aplikasinya gratis, pokoknya tinggal pakai. Bahkan seandainya kita hanya bermodalkan smartphone, kita bisa langsung live. Akan tetapi, untuk mendapatkan hasil yang lebih profesional, kita perlu menggunakan aplikasi yang lebih canggih seperti OBS. Di situ kita bisa menambahkan logo di kanan atas, nama pembicara di bawah (lower third), running text, menjalankan iklan, dan sebagainya. Hasilnya bisa dilihat di event Monday Forum Tazkia

YouTube Hasil Streaming

Dengan sedikit tambahan Nginx RTMP Module, kita bisa mempublikasikannya ke banyak platform sekaligus. Walaupun demikian, Instagram Live masih belum bisa ditangani oleh aplikasi encoder/broadcaster termasuk Nginx RTMP Module ini.

Kita juga bisa menjalankan Nginx RTMP Module ini dengan menggunakan docker. Perintahnya sebagai berikut:

docker run -d --name nginx-rtmp-streamer \
    -p 1935:1935 \
    -p 8080:8080 \
    -e RTMP_PUSH_URLS='rtmp://live.youtube.com/myname/streamkey,rtmp://live-api-s.facebook.com:80/rtmp/streamkey' \
    jasonrivers/nginx-rtmp

Di aplikasi OBS, masukkan setting seperti ini:

Streaming Service: Custom
Server: rtmp://<your server ip>/live
Play Path/Stream Key: mystream

Untuk lebih jelasnya, bisa dilihat langsung dokumentasinya di DockerHub

Selamat mencoba, semoga bermanfaat …

Referensi