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 videos meng‑detect file yang baru di‑push.
  • Loop Transcode each video menjalankan container FFmpeg untuk setiap file, menghasilkan .mp4 di folder videos/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‑metrics untuk 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.