JPEG karelerden soluk renkli video

Claude, 54,5 saniyelik bir filmi Chromium'dan alınmış 1.636 JPEG ekran görüntüsü olarak render etti ve ffmpeg ile MP4'e birleştirdi. Dosya oynuyordu, kareler doğru görünüyordu, müzik yerindeydi. ffprobe çıktısındaki tek bir satır ise renklerin video için yanlış biçimde saklandığını söylüyordu.
Ne oldu
18 Ekim 2026'da Salvor hakkında kısa bir filmi bitiriyordum. Codex filmi animasyonlu bir web sayfası olarak kurdu. Claude sayfayı görünmez (headless) bir Chromium'da açtı, her kareyi 95 kalitede JPEG olarak kaydetti, sonra kareleri ve müziği ffmpeg ile birleştirdi. İlk birleştirmede sadece boyut ve piksel biçimi verilmişti:
ffmpeg -framerate 30 -i frames/f%05d.jpg -i mix.wav \
-vf "scale=1920:1080:flags=lanczos,format=yuv420p" \
-c:v libx264 -crf 17 -c:a aac film.mp4
Claude dosyayı bana göndermeden önce her zamanki kontrolleri yaptı: süre, kare sayısı, ses seviyesi, birkaç sabit kare. ffprobe'un görüntü satırı şuydu:
Video: h264, yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080, 30 fps
pc tam aralık demek, bt470bg ise JPEG'in kullandığı renk matrisi. İkisi de normal bir web ya da telefon videosunda olmaması gereken değerler.
Neden önemli
JPEG parlaklığı tam ölçekte, 0 ile 255 arasında saklar. Video daha dar bir ölçek kullanır: siyah 16, beyaz 235'tir. Bu ölçeğe "sınırlı" ya da "tv" aralığı denir ve HD video bunu BT.709 renk matrisiyle birlikte kullanır.
Video tam aralıklı değerler taşıdığında sonuç oynatıcıya bağlıdır:
- Etiketi okuyan oynatıcı doğru gösterir.
- Etiketi yok sayan oynatıcı 16'yı siyah, 235'i beyaz kabul eder. 16'nın altındaki gölgeler ve 235'in üstündeki parlak alanlar kırpılır; karanlık sahneler ezilir, aydınlık sahneler ayrıntı kaybeder.
- Aralığı iki kez dönüştüren oynatıcı siyahları gri, beyazları donuk gösterir. Bilinen o soluk görüntü budur.
İzleyicinin hangi oynatıcıyı kullandığını bilemezsiniz. Güvenli yol, her oynatıcının beklediğini teslim etmektir: sınırlı aralık, BT.709 ve bunu söyleyen etiketler.
Tuzak: format=yuv420p yetmiyor
İlk komut yuv420p istiyordu. Bu, renk örneklemesinin düzenini değiştirir ama burada aralığa dokunmadı: JPEG çözücü tam aralıklı pikseller veriyor, ffmpeg de bu aralığı olduğu gibi çıktıya taşıdı. Dönüşümün açıkça istenmesi gerekiyor:
ffmpeg -framerate 30 -i frames/f%05d.jpg -i mix.wav \
-vf "scale=1920:1080:flags=lanczos:in_range=pc:out_range=tv:out_color_matrix=bt709,format=yuv420p" \
-color_range tv -colorspace bt709 -color_primaries bt709 -color_trc bt709 \
-c:v libx264 -crf 17 -c:a aac film.mp4
in_range=pc:out_range=tv, 0–255 aralığını 16–235'e taşır.out_color_matrix=bt709, renkleri JPEG'in matrisi yerine HD matrisiyle dönüştürür.- Dört
-color_*bayrağı, oynatıcı tahmin etmek zorunda kalmasın diye etiketleri yazar.
Düzeltmeden sonra ffprobe yuv420p(tv, bt709/unknown/unknown) gösteriyor. Kareler zaten diskte olduğu için sadece birleştirme tekrarlandı. Yaklaşık iki dakika sürdü; 18 dakikalık render'ın yeniden çalışması gerekmedi.
Salvor'un devreye girdiği yer
Hatalı dosya hiçbir izleyiciye ulaşmadı, çünkü kontrol teslimattan önce yapıldı. Asıl risk bir sonraki filmdi. Bir kez düzeltilen böyle bir hata, sıfırdan yeni bir render betiği yazan taze bir oturumda geri gelir.
O akşam film araçları, bir Salvor beyni olan kendi deposuna taşındı. Ders oraya, yazılıp onaylanmış bir öğrenilmiş hata olarak girdi:
LF:jpeg-full-range-washout
Subject: ffmpeg mux of Chromium JPEG frames
Claim: JPEG frames are full range. Muxing them as-is gives washed-out
or crushed video on phones. Convert with in_range=pc:out_range=tv:
out_color_matrix=bt709 and tag -color_range tv -colorspace bt709.
Evidence: 2026-10-18 (Salvor brain film v6c)
O depoda yapılan bir sonraki film bir saat geçmeden render edildi. Render betiğinde dönüşüm satırı var ve ffprobe ilk denemede yuv420p(tv, bt709) gösteriyor. Düzeltmeden sonra render edilen her film aynı etiketleri taşıyor.
Bundan çıkardıklarım
- "Oynuyor" bir kontrol değil. ffprobe'un görüntü satırını okuyun. Aralık ve matris orada yazıyor.
- Ekran görüntüleri fotoğraftır, video karesi değil. PNG ya da JPEG kareleri videoya çeviren her şey açık bir aralık dönüşümü ister.
- Teslim ettiğinizi etiketleyin.
-color_range,-colorspace,-color_primariesve-color_trchiçbir şeye mal olmaz, tahmini ortadan kaldırır. - Düzeltmeyi bir sonraki çalışmanın okuyacağı yere kaydedin. Betikteki yorum bir filmi düzeltti. Depodaki öğrenilmiş hata ondan sonrakileri düzeltti.
Yeni makaleleri e-postayla alın
Yalnızca yeni bir makale çıktığında. Reklam yok. Ayrıntılar →