Jika kamu sering mengunggah video ke YouTube, pasti pernah mengalami dilema antara kualitas video yang tinggi dan ukuran file yang besar. Memang, YouTube otomatis melakukan transcoding ulang, tapi proses tersebut tidak selalu menghasilkan bitrate atau format yang kamu inginkan. Nah, di sinilah CI pipeline untuk transcoding video berperan penting: video kamu sudah di‑optimalkan sebelum masuk ke YouTube, sehingga proses upload lebih cepat dan hasil akhir lebih konsisten.
Artikel ini bakal mengajak kamu langkah demi langkah membangun pipeline otomatis menggunakan GitHub Actions, FFmpeg, dan Docker. Semua dijelaskan dengan bahasa santai, jadi tidak perlu takut tersesat di antara baris‑baris kode. Di akhir baca, kamu sudah siap meng‑push video ke repositori, biarkan pipeline bekerja, dan video yang sudah ter‑transcode langsung siap di‑upload ke channel YouTube kamu.
Kenapa Perlu CI Pipeline untuk Transcoding?
CI (Continuous Integration) bukan hanya buat kode program. Ia juga cocok untuk mengolah aset media seperti video. Berikut beberapa keuntungan utama:
- Otomatisasi penuh: Tidak ada lagi proses manual buka‑buka aplikasi transcoding di laptop.
- Standarisasi output: Semua video akan melewati preset yang sama (resolution, bitrate, codec), sehingga tampilan di YouTube konsisten.
- Skalabilitas: Tambah saja video baru ke repository, pipeline akan menanganinya secara paralel.
- Audit trail: Setiap proses tercatat di log GitHub Actions, memudahkan troubleshooting.
Komponen Utama dalam Pipeline
1. Repository GitHub
Repositori tempat kamu menyimpan file video mentah (raw) serta file konfigurasi pipeline. Biasanya struktur foldernya seperti:
/videos/raw/ # video asli, misalnya .mov atau .avi /videos/processed/ # hasil transcoding, siap di‑upload /.github/workflows/ # file YAML untuk GitHub Actions
2. Docker Image dengan FFmpeg
FFmpeg adalah de‑facto tool untuk transcoding. Kita bungkus FFmpeg dalam Docker image supaya lingkungan eksekusi konsisten di semua runner GitHub Actions. Contoh Dockerfile sederhana:
FROM alpine:latest RUN apk add --no-cache ffmpeg ENTRYPOINT ["ffmpeg"]
Dengan image ini, kamu tidak perlu khawatir runner GitHub tidak memiliki FFmpeg atau versi yang berbeda.
3. GitHub Actions Workflow
File .github/workflows/video-transcode.yml mengatur alur kerja:
- Trigger: push atau pull request ke folder
videos/raw. - Job: menjalankan container Docker, membaca file video, meng‑output ke folder
videos/processed. - Optional: meng‑upload hasil ke bucket cloud storage atau langsung ke YouTube via API.
4. YouTube API (Opsional)
Jika kamu ingin otomatis meng‑upload setelah transcoding, gunakan YouTube Data API v3. Simpan API_KEY dan OAUTH_TOKEN di GitHub Secrets supaya aman. Lihat juga artikel Cara Mudah Menghubungkan Google Cloud Function, GitHub, dan YouTube Live untuk contoh integrasi yang lebih kompleks.
Langkah‑Langkah Membuat Pipeline
1. Siapkan Repository
Buatan repository baru atau gunakan yang sudah ada. Pastikan kamu memiliki folder videos/raw dan .github/workflows. Commit file README.md yang menjelaskan struktur folder agar kolaborator tidak bingung.
2. Buat Docker Image
Di root repository, buat file Dockerfile seperti contoh di atas. Setelah itu, push ke Docker Hub atau GitHub Container Registry (GHCR). Contoh perintah:
docker build -t ghcr.io/username/video-transcoder:latest . docker push ghcr.io/username/video-transcoder:latest
Jangan lupa menambahkan token GHCR_TOKEN ke GitHub Secrets supaya workflow dapat menarik image tanpa autentikasi tambahan.
3. Definisikan Workflow GitHub Actions
Berikut contoh lengkap video-transcode.yml:
name: Video Transcoding CI
on:
push:
paths:
- 'videos/raw/**'
jobs:
transcode:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Pull transcoder image
run: |
docker pull ghcr.io/username/video-transcoder:latest
- name: Find new videos
id: files
run: |
echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep '^videos/raw/' | tr 'n' ' ')" >> $GITHUB_OUTPUT
- name: Transcode each video
if: steps.files.outputs.files != ''
run: |
for video in ${{ steps.files.outputs.files }}; do
filename=$(basename "$video")
docker run --rm -v ${{ github.workspace }}/videos/raw:/input -v ${{ github.workspace }}/videos/processed:/output ghcr.io/username/video-transcoder:latest -i "/input/$filename" -c:v libx264 -preset slow -crf 23 -c:a aac -b:a 128k "/output/${filename%.*}.mp4"
done
Penjelasan singkat:
- Workflow dipicu setiap ada push ke folder
videos/raw. - Langkah
Find new videosmeng‑detect file yang baru di‑push. - Loop
Transcode each videomenjalankan container FFmpeg untuk setiap file, menghasilkan.mp4di foldervideos/processed.
4. Tambahkan Linting & Test (Opsional)
Jika kamu ingin memastikan video yang dihasilkan tidak korup, tambahkan langkah sederhana memakai ffprobe untuk mengecek durasi dan codec. Misalnya:
- name: Validate output
run: |
for out in videos/processed/*.mp4; do
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$out"
done
5. Upload ke YouTube (Opsional)
Setelah video siap, gunakan googleapis/google-api-python-client atau youtube-upload CLI di dalam container lain. Berikut contoh singkat dengan Python script yang dipanggil lewat GitHub Action:
- name: Upload to YouTube
env:
YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
YOUTUBE_OAUTH_TOKEN: ${{ secrets.YOUTUBE_OAUTH_TOKEN }}
run: |
pip install google-auth google-auth-oauthlib google-api-python-client
python upload_to_youtube.py videos/processed/*.mp4
Script upload_to_youtube.py bisa kamu temukan di repositori contoh, atau lihat artikel Tutorial Mengupload Subtitle Otomatis ke YouTube lewat GitHub untuk integrasi yang lebih lengkap.
Tips Optimasi Transcoding
Pilih Preset yang Sesuai
FFmpeg menawarkan preset seperti ultrafast, medium, slow. Semakin lambat preset, semakin efisien kompresi, tapi membutuhkan waktu lebih lama. Untuk video tutorial atau vlog, medium biasanya cukup.
Gunakan CRF (Constant Rate Factor)
Alih‑alih mengatur bitrate statis, pakai -crf. Nilai 18‑23 memberikan kualitas tinggi tanpa ukuran berlebih. Eksperimen dengan -crf 20 untuk keseimbangan terbaik.
Batch Processing
Jika ada banyak video sekaligus, pertimbangkan GNU Parallel atau jalankan beberapa container secara bersamaan. Ini mengurangi total waktu pipeline secara signifikan.
Cache Input Files
GitHub Actions menyediakan cache action. Simpan file video yang sudah pernah diproses sehingga hanya video baru yang di‑transcode ulang.
Integrasi dengan Cloud Storage
Jika ukuran video terlalu besar untuk disimpan di repo, gunakan bucket S3, Google Cloud Storage, atau Azure Blob. Tambahkan langkah aws s3 cp atau gsutil cp sebelum atau sesudah transcoding. Lihat juga artikel Cara Gampang Integrasi Twitch & YouTube Streaming Pakai GitHub Actions untuk contoh penggunaan cloud storage dalam workflow.
Contoh Kasus: Vlog Travel 4K ke 1080p
Misalkan kamu merekam vlog travel dalam resolusi 4K (3840×2160) dengan bitrate 50 Mbps. Untuk YouTube, 1080p sudah cukup, dan ukuran file harus jauh lebih kecil agar upload cepat. Berikut preset FFmpeg yang cocok:
ffmpeg -i input.mov -c:v libx264 -preset slow -crf 22 -vf "scale=1920:1080" -c:a aac -b:a 128k output.mp4
Dalam pipeline, langkah di atas sudah ter‑automasi di job Transcode each video. Hasilnya: file .mp4 1080p, ukuran sekitar 1 GB untuk video 20 menit, siap di‑upload.
Menjaga Keamanan API dan Secret
Jangan pernah menaruh kunci API atau token OAuth secara plain text di repo. Gunakan GitHub Secrets dan referensikan dengan sintaks ${{ secrets.NAMA_SECRET }}. Jika ingin menambah lapisan keamanan, pertimbangkan Rahasia Terungkap! Cara Mengamankan Kunci API YouTube di GitHub Secrets Tanpa Ribet untuk panduan enkripsi tambahan.
Debugging & Monitoring
Jika pipeline gagal, periksa log pada tab Actions di GitHub. Klik job yang gagal, lalu scroll ke bagian error. Umumnya, masalah muncul karena:
- File video tidak ditemukan (path mismatch).
- Docker image tidak dapat di‑pull (token expired).
- FFmpeg menghasilkan error codec (mis‑specify codec atau bitrate).
Tambahkan set -x pada script Bash untuk menampilkan perintah yang dijalankan secara detail. Kamu juga dapat meng‑aktifkan step-level caching untuk mempercepat proses jika hanya sebagian video yang berubah.
Future Enhancements
- Integrasi AI Captioning: setelah video ter‑transcode, jalankan model speech‑to‑text untuk menghasilkan subtitle otomatis, lalu upload lewat API.
- Multi‑format Output: selain MP4, buat versi WebM atau HEVC untuk keperluan platform lain.
- Quality Gate: gunakan
ffmpeg‑quality‑metricsuntuk memastikan PSNR atau SSIM di atas threshold tertentu sebelum melanjutkan ke upload.
Dengan pipeline yang solid, kamu tidak hanya menghemat waktu, tapi juga menjaga kualitas konten secara konsisten. Selamat mencoba, dan semoga video‑videomu semakin cepat sampai ke penonton tanpa harus menunggu proses transcoding yang panjang di sisi YouTube.
