ffdrop

Drag-to-encode-frontend för ffmpeg och sips. Samlar de transkodningar man kör om och om igen i video-/animationsproduktion — encode, ProRes-intermediates, color-tag-fixar, range-konvertering, audio-extract, PNG-sekvens — och nu bildkonvertering med ICC-profilhantering, bakom en drop-yta istället för ett terminalfönster.

macOS / Apple Silicon (arm64) shellar systemets ffmpeg/ffprobe + sips signerad & notariserad v0.6.0

Presets

Varje preset mappar direkt till ett ffmpeg-anrop. Inga dolda heuristiker.

PresetCodec / profilPixelformatAudioContainer
Video → MP4 (h264) libx264 · profile main · CRF (default 20) yuv420p aac 192k / -an .mp4 +faststart
Video → ProRes 422 Proxy prores_ks · -profile:v 0 yuv422p10le pcm_s16le .mov
Video → ProRes 422 LT prores_ks · -profile:v 1 yuv422p10le pcm_s16le .mov
Video → ProRes 422 HQ prores_ks · -profile:v 3 yuv422p10le pcm_s16le .mov
Video → WAV (extract) -vn · pcm_s16le passthrough → PCM .wav
Video → MP3 (extract) -vn · libmp3lame -q:a 2 VBR ~190 kbps .mp3
Video → Lura QuickTime-gamma -c copy · -color_trc iec61966-2-1 + h264_metadata transfer=13 passthrough passthrough .mp4 +write_colr
Video → Återställ gamma-hack -c copy · -color_trc bt709 + h264_metadata transfer=1 passthrough passthrough .mp4 +write_colr
PNG-sequence → MP4 h264 libx264 · CRF 20 yuv420p .mp4 +faststart
PNG-sequence → ProRes 422 HQ prores_ks · -profile:v 3 yuv422p10le .mov

ProRes-presets sätter -vendor apl0. PNG-sekvenser detekteras på mönster i droppad mapp; framerate väljs i UI och matas som -framerate.

Color-tag & range

Skriv om color-metadata utan omkodning, eller konvertera range på pixelnivå. Per-fil-override av primaries / transfer / matrix / range, läst från ffprobe och presenterat i info-panelen.

Metadata-only (lossless)

Skriver om color-atomerna med -c copy — ingen ny encode, bitströmmen är orörd. Rättar felflaggade transfer/primaries/matrix/range när taggen är fel snarare än pixeldatan. (För det Apple-specifika ~1.96-gammaskiftet, se QuickTime-hacket nedan.)

ffmpeg -i in.mov -c copy \
  -color_primaries bt709 \
  -color_trc bt709 \
  -colorspace bt709 \
  -color_range tv \
  in_retagged.mov

Range-rescale (destruktiv)

När pixelvärdena faktiskt är fel-skalade: bocka i pixel-rescale så läggs ett scale-steg in i filterkedjan. tv → limited, pc → full, in_range auto-detekteras.

-vf scale=in_range=auto:out_range=limited

Flaggorna mappar 1:1 mot ffmpeg: -color_primaries / -color_trc / -colorspace / -color_range.

QuickTime-gamma (fulhack)

macOS ColorSync (QuickTime, Preview, mellanslag i Finder, Safari, Chrome) renderar Rec.709 i Gamma ~1.96 — plattare och ljusare än 2.2–2.4. VLC och redigerare visar rätt. Lura QuickTime-gamma taggar om transfer till sRGB (13) på både container-colr-atomen och H.264-VUI-flaggan, så ColorSync hamnar på ~2.2-kurvan. Pixlarna är orörda. Det är ett nollsummebyte, inte en lagning: filen ser då fel ut i VLC / Premiere / AE / DaVinci. En och samma fil kan inte se likadan ut i båda lägren. Återställ gamma-hack skriver transfer tillbaka till bt709 — bitidentisk rundtur. Endast h264; bara för Mac-visning, aldrig master.

# lura: container + bitström → sRGB
-c copy -color_trc iec61966-2-1 -color_primaries bt709 -colorspace bt709 \
  -movflags +faststart+write_colr \
  -bsf:v h264_metadata=transfer_characteristics=13:colour_primaries=1:matrix_coefficients=1

h264-kedjan i klartext

MP4-presetet är fullt parametriserat från UI:t. Inget gissas — det här är exakt vad som körs (toggles utelämnade när av):

ffmpeg -y -hide_banner -i in.mov \
  [-vf scale=trunc(iw/4)*2:trunc(ih/4)*2]   # "skala 50%"
  [-vf scale=in_range=auto:out_range=limited]  # range-rescale
  -c:v libx264 -crf N -preset medium \
  -profile:v main -pix_fmt yuv420p -movflags +faststart \
  [-color_primaries … -color_trc … -colorspace … -color_range …] \
  [-tune grain]                              # "bevara grain"
  [-c:a aac -b:a 192k | -an] \
  out_h264_crfN.mp4

Output-filnamnet kodar valen: _h264_crf20_50_grain_noaudio_colortagged. Skala-uttrycket trunkerar till jämna dimensioner (h264-krav). Progress läses från -progress pipe:1 mot frame-count från ffprobe.

Bild & ICC

Stillbilder går via sips (inte ffmpeg — som hanterar ICC-profiler dåligt). Dra in PNG / JPEG / TIFF / HEIC / WebP, konvertera till valfritt utdataformat, med per-bild ICC-åtgärd. Inga nya beroenden — sips finns i macOS.

Målsips-formatKvalitetAlpha16-bit
Bild → PNGpnglossless (DEFLATE)bevarasbevaras
Bild → JPEGjpegformatOptions 1–100 (def 95)plattas mot vitt
Bild → TIFFtifflosslessbevarasbevaras
Bild → HEICheicsips defaultbevarasbevaras

WebP läses som indata men skrivs inte (sips saknar webp-encode). Filändelse mappas till sips-formatnamn: jpg→jpeg, tif→tiff.

Fyra ICC-åtgärder

Behåll / Assign

Behåll lämnar källprofilen orörd. Assign bäddar in en vald profil utan att röra pixlarna (sips --embedProfile) — som Photoshops "Assign Profile". Profil-listan filtreras till embed-bara RGB-profiler (ICC-headern läses; CMYK/Gray/Lab/abstrakta tone-profiler sållas bort).

sips -s format jpeg \
  --embedProfile "…/sRGB Profile.icc" \
  in.png --out in_sRGB.jpg

Convert / Ta bort

Convert räknar om pixlarna mellan profiler med renderingsintent (--matchToWithIntent; perceptual/relative/saturation/absolute). Ta bort river färgmarkeringen till en fysiskt naken fil via egen PNG-chunk- och JPEG-marker-kirurgi (inte bara sips, som alltid återbäddar en default).

sips --matchToWithIntent \
  "…/Display P3.icc" relative \
  in.png --out in_DisplayP3.png

Fallgropar som ffdrop varnar för i UI:t: Convert nedsamplar 16-bit → 8-bit (Assign bevarar djupet). JPEG saknar alpha — transparens plattas mot vitt (välj PNG/TIFF/HEIC för att behålla den). Info-panelen läser råfilen, inte sips -g profile (som rapporterar default-sRGB även på en profil-lös fil). Utdatanamnet kodar profil + kvalitet: bild_sRGB_q95.jpg.

Krav