[FFmpeg-user] Need more info on blend filter
compname at verizon.net
compname at verizon.net
Mon Jun 22 03:45:22 CEST 2015
At 6/21/2015 11:11 AM, you wrote:
>On 6/21/15, compname at verizon.net <compname at verizon.net> wrote:
> > I'm trying to overlay a spectrum analyzer display over another
> > video. I want the analyzer bars to show on top of the other video,
> > but nothing else. The spectrum analyzer video consists of blue bars
> > on a black background. I tried the following filter:
> >
> >
> [base_vid][spec]blend=all_expr='if(gte(B,10),B,A)':all_opacity=1,format=rgba[out]
> >
> > This "almost" works in that I get the desired effect more or less,
> > but there are some pixels on the edge of the blue bars that turn
> > different colors. I think this is because the blend filter makes its
> > comparison on each channel individually. The pixel format for
> > base_vid & spec is rgba. In order to have a successful transparent
> > overlay, I need to have the comparison on B made on the luminance
> > only. So I changed the pix_fmt for base_vid & spec to yuvj444p,
> > which then lets me compare c0 (luminance) in the blend filter. The
> > problem is I need to have the luminance of B control the other 3
> > channels as well. I don't see how this can be done given what's
> > given in the ffmpeg-filters manual. What I really need is something like
> > this:
> >
> >
> [base_vid][spec]blend=c0_expr='if(gte(B,10),B,A)':c1_expr='if(gte(c0,10),B,A)':c2_expr='if(gte(c0,10),B,A:c3_expr=(gte(c0,10),B,A:all_opacity=1,format=yuvj444p[out]
> >
> > (yes I did try it - doesn't work :( )
> >
> > Is there a way to do this, or is blend limited to intra-channel
> > operations? Thanks.
>
>Currently it is limited to intra-channel operations, maybe i will add
>feature to access other channels data too.
OK thanks. I was beginning to suspect such, & started pursuing a
different path: using the geq filter on the spectrum overlay video to
selectively change the alpha on the black pixels to 0.
geq=r='r(X,Y)':g='g(X,Y)':b='b(X,Y)':a='if(gte(r(X,Y)+g(X,Y)+b(X,Y),50),255,0)'
Then I can replace the blend filter with a simple overlay.
Some simplification may be possible by using YUV space instead of
RGB, but I wasn't sure if the alpha channel was available for the YUV
formats. I'll probably experiment more later, but in the meantime
this seems to work great.
More information about the ffmpeg-user
mailing list