0

I am trying to replace an arbitrary color in a video with another arbitrary color. In this case I want to replace #72f3f2 (rgb(114,243,242)) with #7ccbd4 (rgb(124,203,212)) in a video file using ffmpeg.

I have tried using the lutrgb filter below which I derived from this question, but it seems to have no effect.

How can I only replace the entire set of one RGB value with another?

$ ffmpeg -i in.mp4 -vf "format=rgb24,lutrgb=r='if(eq(val,45),49,val)':g='if(eq(val,95),80,val)':b='if(eq(val,95),83,val)'" -vcodec libx265 out.mp4
ffmpeg version 4.2.2-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-6)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:30.00, start: 0.020000, bitrate: 2400 kb/s
    Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709), 2000x1126 [SAR 1:1 DAR 1000:563], 2324 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 143 kb/s (default)
    Metadata:
      handler_name    : Stereo
File 'out.mp4' already exists. Overwrite ? [y/N] y
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.3+2-dd2464df2f40
x265 [info]: build info [Linux][GCC 8.3.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6
x265 [info]: Main 4:4:4 profile, Level-5 (Main tier)
x265 [info]: Thread pool created using 8 threads
x265 [info]: Slices                              : 1
x265 [info]: frame threads / pool features       : 3 / wpp(18 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge         : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias  : 25 / 250 / 40 / 5.00 
x265 [info]: Cb/Cr QP Offset                     : 6 / 6
x265 [info]: Lookahead / bframes / badapt        : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb       : 1 / 1 / 0
x265 [info]: References / ref-limit  cu / depth  : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree  : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress            : CRF-28.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=7 deblock sao
Output #0, mp4, to 'out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.29.100
    Stream #0:0(und): Video: hevc (libx265) (hev1 / 0x31766568), gbrp, 2000x1126 [SAR 1:1 DAR 1000:563], q=2-31, 29.97 fps, 30k tbn, 29.97 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc58.54.100 libx265
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : Stereo
      encoder         : Lavc58.54.100 aac
frame=  901 fps= 15 q=-0.0 Lsize=    6979kB time=00:00:29.99 bitrate=1906.1kbits/s dup=32 drop=0 speed=0.492x    
video:6470kB audio:472kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.524252%
x265 [info]: frame I:      6, Avg QP:27.55  kb/s: 9044.56 
x265 [info]: frame P:    222, Avg QP:29.70  kb/s: 5202.73 
x265 [info]: frame B:    673, Avg QP:35.37  kb/s: 562.33  
x265 [info]: Weighted P-Frames: Y:6.8% UV:6.8%
x265 [info]: consecutive B-frames: 4.8% 4.4% 3.5% 65.4% 21.9% 

encoded 901 frames in 60.78s (14.82 fps), 1762.18 kb/s, Avg QP:33.93
[aac @ 0x62b24c0] Qavg: 260.747

I've tried using RGB percent values (0-100) and RGB decimal values, as well as lutyuv filter to no avail.

  • How did you identify the source color values? – Gyan Apr 15 at 5:45
  • @Gyan taking a screenshot of one of the frames from in.mp4 and then using the color picker in e.g. Photoshop – Jeff Mixon Apr 15 at 17:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.