2017-06-26 6 views
0

J'utilise Fluent-FFmpeg avec Node.JS pour créer des vidéos avec du texte superposé dessus et je veux changer la couleur du texte au fur et à mesure que la vidéo progresse.FFmpeg fontcolor_expr pour changer dynamiquement fontcolor au fil du temps

Mes filtres suivent ce modèle:

drawtext=enable='between(t,18.93,20.28)':fontfile=fonts/cousine-bold.ttf:fontsize=144:fontcolor_expr=%{expr\\\: if(between(t\\, 0\\, 20)\\, 888888\\, 111111)}:x=82:y=288:text='PROGRAMMING' 

Et il imprime ce genre de choses:

ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers 
    built with Apple LLVM version 8.1.0 (clang-802.0.42) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libfreetype --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda 
    libavutil  55. 58.100/55. 58.100 
    libavcodec  57. 89.100/57. 89.100 
    libavformat 57. 71.100/57. 71.100 
    libavdevice 57. 6.100/57. 6.100 
    libavfilter  6. 82.100/6. 82.100 
    libavresample 3. 5. 0/3. 5. 0 
    libswscale  4. 6.100/4. 6.100 
    libswresample 2. 7.100/2. 7.100 
    libpostproc 54. 5.100/54. 5.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'uploads/0c719e39820366bc62c8fd66a6327828': 
    Metadata: 
    major_brand  : qt 
    minor_version : 0 
    compatible_brands: qt 
    creation_time : 2017-06-23T00:19:46.000000Z 
    com.apple.quicktime.make: Apple 
    com.apple.quicktime.model: MacBookPro9,2 
    com.apple.quicktime.software: Mac OS X 10.12.5 (16F73) 
    com.apple.quicktime.creationdate: 2017-06-22T17:18:42-0700 
    Duration: 00:00:22.00, start: 0.000000, bitrate: 3408 kb/s 
    Stream #0:0(und): Video: h264 (Main) (avc1/0x31637661), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], 3091 kb/s, 15 fps, 15 tbr, 30k tbn, 50 tbc (default) 
    Metadata: 
     creation_time : 2017-06-23T00:19:46.000000Z 
     handler_name : Core Media Data Handler 
     encoder   : H.264 
    Stream #0:1(und): Audio: aac (LC) (mp4a/0x6134706D), 44100 Hz, stereo, fltp, 316 kb/s (default) 
    Metadata: 
     creation_time : 2017-06-23T00:19:46.000000Z 
     handler_name : Core Media Data Handler 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) 
    Stream #0:1 -> #0:1 (aac (native) -> aac (native)) 
Press [q] to stop, [?] for help 
[libx264 @ 0x7ff72e810a00] using SAR=1/1 
[libx264 @ 0x7ff72e810a00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX 
[libx264 @ 0x7ff72e810a00] profile High, level 3.1 
[libx264 @ 0x7ff72e810a00] 264 - core 148 r2748 97eaef2 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0  direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 
Output #0, mp4, to './outputFile.mp4': 
    Metadata: 
    major_brand  : qt 
    minor_version : 0 
    compatible_brands: qt 
    com.apple.quicktime.creationdate: 2017-06-22T17:18:42-0700 
    com.apple.quicktime.make: Apple 
    com.apple.quicktime.model: MacBookPro9,2 
    com.apple.quicktime.software: Mac OS X 10.12.5 (16F73) 
    encoder   : Lavf57.71.100 
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0]/0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 15 fps, 15360 tbn, 15 tbc (default) 
    Metadata: 
     creation_time : 2017-06-23T00:19:46.000000Z 
     handler_name : Core Media Data Handler 
     encoder   : Lavc57.89.100 libx264 
    Side data: 
     cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1 
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0]/0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default) 
    Metadata: 
     creation_time : 2017-06-23T00:19:46.000000Z 
     handler_name : Core Media Data Handler 
     encoder   : Lavc57.89.100 aac 
frame= 52 fps=0.0 q=27.0 size=  37kB time=00:00:04.66 bitrate= 65.7kbits/s speed=8.74x  
frame= 72 fps= 70 q=27.0 size=  187kB time=00:00:06.03 bitrate= 253.4kbits/s speed=5.83x  
frame= 95 fps= 61 q=27.0 size=  358kB time=00:00:07.52 bitrate= 390.4kbits/s speed=4.82x  
frame= 117 fps= 57 q=27.0 size=  569kB time=00:00:08.98 bitrate= 518.9kbits/s speed=4.35x  
frame= 137 fps= 53 q=27.0 size=  732kB time=00:00:10.32 bitrate= 580.2kbits/s speed=4.03x  
frame= 159 fps= 52 q=27.0 size=  942kB time=00:00:11.79 bitrate= 654.7kbits/s speed=3.84x  
frame= 180 fps= 50 q=27.0 size= 1110kB time=00:00:13.18 bitrate= 689.5kbits/s speed=3.67x  
frame= 204 fps= 50 q=27.0 size= 1331kB time=00:00:14.78 bitrate= 737.2kbits/s speed= 3.6x  
frame= 223 fps= 48 q=27.0 size= 1486kB time=00:00:16.06 bitrate= 757.9kbits/s speed=3.49x  
frame= 248 fps= 48 q=27.0 size= 1708kB time=00:00:17.71 bitrate= 789.7kbits/s speed=3.46x  
frame= 266 fps= 47 q=27.0 size= 1859kB time=00:00:18.92 bitrate= 805.0kbits/s speed=3.35x  
frame= 285 fps= 46 q=27.0 size= 2013kB time=00:00:20.19 bitrate= 816.4kbits/s speed=3.28x  
[drawtext @ 0x7ff72d84bc00] Cannot find color '888888.000000' 
    Last message repeated 9 times 
frame= 308 fps= 46 q=27.0 size= 2224kB time=00:00:21.75 bitrate= 837.5kbits/s speed=3.27x  
frame= 330 fps= 46 q=27.0 size= 2401kB time=00:00:21.96 bitrate= 895.5kbits/s speed=3.06x  
frame= 330 fps= 41 q=-1.0 Lsize= 2834kB time=00:00:22.00 bitrate=1055.0kbits/s speed=2.73x  
video:2484kB audio:338kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.441003% 
[libx264 @ 0x7ff72e810a00] frame I:22 Avg QP:13.64 size: 47604 
[libx264 @ 0x7ff72e810a00] frame P:154 Avg QP:16.76 size: 8574 
[libx264 @ 0x7ff72e810a00] frame B:154 Avg QP:19.42 size: 1138 
[libx264 @ 0x7ff72e810a00] consecutive B-frames: 6.7% 93.3% 0.0% 0.0% 
[libx264 @ 0x7ff72e810a00] mb I I16..4: 85.1% 13.3% 1.6% 
[libx264 @ 0x7ff72e810a00] mb P I16..4: 5.5% 3.1% 0.0% P16..4: 41.5% 4.0% 5.5% 0.0% 0.0% skip:40.4% 
[libx264 @ 0x7ff72e810a00] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 14.7% 0.1% 0.0% direct: 4.7% skip:80.4% L0:28.0% L1:71.4% BI: 0.7% 
[libx264 @ 0x7ff72e810a00] 8x8 transform intra:21.7% inter:84.8% 
[libx264 @ 0x7ff72e810a00] coded y,uvDC,uvAC intra: 60.5% 98.6% 92.9% inter: 6.0% 24.3% 3.1% 
[libx264 @ 0x7ff72e810a00] i16 v,h,dc,p: 35% 19% 43% 3% 
[libx264 @ 0x7ff72e810a00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10% 7% 80% 1% 1% 1% 1% 0% 0% 
[libx264 @ 0x7ff72e810a00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 33% 20% 45% 0% 0% 0% 0% 0% 0% 
[libx264 @ 0x7ff72e810a00] i8c dc,h,v,p: 77% 9% 10% 4% 
[libx264 @ 0x7ff72e810a00] Weighted P-Frames: Y:0.0% UV:0.0% 
[libx264 @ 0x7ff72e810a00] ref P L0: 75.3% 0.3% 17.1% 7.3% 
[libx264 @ 0x7ff72e810a00] ref B L0: 80.0% 20.0% 
[libx264 @ 0x7ff72e810a00] kb/s:924.66 
[aac @ 0x7ff72e812200] Qavg: 2159.960 

En particulier ce bit agaçant:

[drawtext @ 0x7ff72d84bc00] Cannot find color '888888.000000' 

Cependant, il serait vraiment agréable de faire quelque chose comme ceci:

fontcolor_expr=%{expr\\\\: if(between(t\\, 0\\, 20)\\, pink\\, white)} 

qui imprime cette erreur:

[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
frame= 287 fps= 46 q=27.0 size= 2023kB time=00:00:20.31 bitrate= 815.9kbits/s speed=3.27x  
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Undefined constant or missing '(' in 'pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] [Eval @ 0x7fff5f7760c0] Missing ')' or too many args in 'if(between(t,0,20),pink,white)' 
[Parsed_drawtext_0 @ 0x7ff3cf523300] Expression 'if(between(t, 0, 20), pink, white)' for the expr text expansion function is not valid 

Il n'y a pas beaucoup d'exemples de fontcolor_expr, donc je voulais voir si quelqu'un avait de l'expérience avec cela. Des conseils sur le changement dynamique de fonrcolors sans créer plusieurs filtres?

Veuillez noter que fontcolor_expr=white et fontcolor_expr=888888 sont valides et créent des vidéos avec une couleur de police fixe.

Répondre

0

Je l'ai pensé à elle assez pour ce que j'ai besoin pour:

drawtext=enable='between(t,18.93,20.28)':fontfile=fonts/cousine-bold.ttf:fontsize=144:fontcolor_expr=%{eif\\: if(between(t\, 18.93\, 19.02)\, 0xFFFFFF\, 0xFFB6C1) \\: x}:x=82:y=288:text='PROGRAMMING' 

Plus précisément:

fontcolor_expr=%{eif\\: if(between(t\, 18.93\, 19.02)\, 0xFFFFFF\, 0xFFB6C1) \\: x} 

D'après ce que je peux dire eif :expression :format :decimal[optional] permet une expression à exécuter et retourné dans un format spécifique. En exécutant l'instruction if dans eif et en spécifiant x à la fin, il renvoie le résultat de l'expression en tant que valeur hexadécimale.

Juste pour sauver quelqu'un à l'avenir quelques problèmes, tout doit être échappé correctement. En Node.JS, j'utilise l'interpolation de chaîne et mon code ressemble à ceci:

`drawtext=enable='between(t,${groupStart},${groupEnd})':fontfile=${fontFile}:fontsize=${fontSize}:fontcolor_expr=%{eif\\\\: if(between(t\\, ${groupStart}\\, ${wordStart})\\, 0xFFFFFF\\, 0xFFB6C1) \\\\: x}:x=${Math.floor((fontSize/1.75) * xDistance)}:y=${Math.floor(fontSize * (lineCount + 1))}:text='${elem[0]}'`

expr_int_format, eif

Evaluate the expression's value and output as formatted integer. The first argument is the expression to be evaluated, just as for the expr function. The second argument specifies the output format. Allowed values are x, X, d and u. They are treated exactly as in the "printf" function. The third parameter is optional and sets the number of positions taken by the output. It can be used to add padding with zeros from the left.

De: https://www.mankier.com/1/ffmpeg-all