Nah ini problem klasik ffmpeg š ā kamu ketemu masalah yang real banget.
š Penyebabnya:
- video awalnya hitam / fade in / intro kosong
- kamu ambil frame di detik ke-2 ā hasilnya blank
šÆ SOLUSI YANG BENAR
Jangan fix di 2 detik.
š ambil frame di tengah video (ini best practice)
ā” SOLUSI 1 ā Ambil di tengah video (RECOMMENDED)
Kita upgrade script kamu.
š§ Update generate-thumb.js
Ganti jadi ini:
import fs from "fs";
import { execSync } from "child_process";
const mediaDir = "./media";
const files = fs.readdirSync(mediaDir);
const videos = files.filter(f => f.endsWith(".mp4"));
videos.forEach(file => {
const name = file.replace(".mp4", "");
const input = `${mediaDir}/${file}`;
const output = `${mediaDir}/${name}.jpg`;
if (!fs.existsSync(output)) {
try {
// ambil durasi video
const duration = execSync(
`ffprobe -i "${input}" -show_entries format=duration -v quiet -of csv="p=0"`
).toString().trim();
const middle = Math.floor(duration / 2);
console.log(`Thumbnail ${file} at ${middle}s`);
execSync(
`ffmpeg -ss ${middle} -i "${input}" -vframes 1 "${output}"`
);
} catch (err) {
console.log(`Error processing ${file}`);
}
}
});
console.log("Done!");
š§ Kenapa ini lebih bagus?
š Karena:
- frame tengah hampir selalu ada isi
- gak kena intro kosong
- hasil lebih representatif
ā” SOLUSI 2 ā fallback kalau masih blank (advanced)
Kalau kamu mau lebih gila lagi:
š ambil beberapa frame:
1 detik
3 detik
5 detik
tengah
pilih yang paling "tidak gelap"
Tapi ini sudah masuk level advance ā belum perlu sekarang.
ā” SOLUSI 3 ā quick fix (kalau gak mau ribet)
Ganti saja:
-ss 00:00:02
jadi:
-ss 00:00:05
atau:
-ss 00:00:10
š tapi ini kurang pintar dibanding middle method
š¬ Saran jujur (biar kamu gak buang waktu)
š Pakai middle video method
Itu yang dipakai banyak platform juga.
š Bonus upgrade (opsional tapi bagus)
Biar thumbnail lebih bagus:
-vf "scale=320:-1"
jadi:
execSync(
`ffmpeg -ss ${middle} -i "${input}" -vframes 1 -vf "scale=320:-1" "${output}"`
);
š hasil:
- ringan
- konsisten ukuran
šÆ Summary kamu sekarang
Kamu sudah punya:
ā
auto detect
ā
auto pairing
ā
auto thumbnail (smart)
ā
multi format player
š ini sudah production-ready pipeline dasar
š Next step (kalau kamu lanjut)
Kalau kamu mau:
š kita bikin:
- š¬ auto scan
.m3u8 - š§ generate metadata (duration, resolution)
- āļø deploy ke Cloudflare Pages
š Sekarang
Coba update script tadi.
Kalau sudah:
š bilang "thumb smart done"
Kalau ada error:
š kirim errornya
Kita refine lagi sampai bener-bener solid š„