[Libav-user] blackdetect using libavfilter C API

Philippe Gorley philippe.gorley at savoirfairelinux.com
Fri Mar 8 23:23:12 EET 2019

On 2019-03-08 2:47 p.m., Venkateswaran.S wrote:
> Hi Philippe,
> Thanks for your reply. I have got the required output by adding below 
> function call in my code,
> if ((tag = av_dict_get(filt_frame->metadata, "lavfi.black_duration", 
>      printf("%s=%s\n", tag->key);
> and it prints below output,
> [blackdetect @ 0x5566fef000c0] black_start:5.46379 black_end:7.29896 
> black_duration:1.83517
> [blackdetect @ 0x5566fef000c0] black_start:82.8328 black_end:84.4594 
> black_duration:1.62662
> [blackdetect @ 0x5566fef000c0] black_start:142.768 black_end:144.019 
> black_duration:1.25125
> I'm using "lavfi.black_duration" because if I use "lavfi.black_start" it 
> print black_start at 0 second (false detection).

I could not find "lavfi.black_duration" anywhere in the file 
libavfilter/vf_blackdetect.c (or the source code at all), so I doubt 
it's being set.

If the key doesn't exist in the AVDictionary, av_dict_get returns NULL 
(0). You want to check until it returns an actual AVDictionaryEntry, 
then check AVDictionaryEntry.value for the time string.

> Now, I tried to run the same filter through command line using below 
> command,
> ffmpeg -i SonOfGod.mp4 -vf "blackdetect=d=1:pix_th=0.00" -an -f null -
> and it prints below output,
> [blackdetect @ 0x5601cbc54c60] black_start:5.46379 black_end:7.007 
> black_duration:1.54321
> [blackdetect @ 0x5601cbc54c60] black_start:82.8745 black_end:84.1674 
> black_duration:1.29296
> above command line tool produces perfect output and exactly matches with 
> actual video content timing (black start & back end).
> How does both the C API and FFmpeg cmd tool give different output? is 
> there anything I'm missing in C API code 
> https://ffmpeg.org/doxygen/3.4/filtering__video_8c_source.html (removed 
> display_frame function).

The black duration log you see is the result of the filter subtracting 
black_start from black_end in the check_black_end function.

> Testing Video: https://www.youtube.com/watch?v=-Hsl5UG9O_c&t=6s
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".

You want to get lavfi.black_end and lavfi.black_start, parse the time 
strings and find the difference.

Philippe Gorley
Free Software Consultant | Montréal, Qc
Savoir-faire Linux

More information about the Libav-user mailing list