【问题标题】:Can you put the result of a blackdetect filter in a textfile using ffmpeg?您可以使用 ffmpeg 将 blackdetect 过滤器的结果放入文本文件中吗?
【发布时间】:2022-02-11 22:59:36
【问题描述】:

我正在测试 ffmpeg 中的“blackdetect”过滤器。我希望有时间让脚本(如 actionscript 或 javascript)读取视频是黑色的。我试过了:

ffmpeg -i video1.mp4 -vf "blackdetect=d=2:pix_th=0.00" -an -f null -

我在 ffmpeg 日志中得到了很好的结果:

ffmpeg version N-55644-g68b63a3 Copyright (c) 2000-2013 the FFmpeg developers
  built on Aug 19 2013 20:32:00 with gcc 4.7.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetyp
e --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --ena
ble-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libsp
eex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-
amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --
enable-libxvid --enable-zlib
  libavutil      52. 42.100 / 52. 42.100
  libavcodec     55. 28.100 / 55. 28.100
  libavformat    55. 13.103 / 55. 13.103
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 82.100 /  3. 82.100
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf53.13.0
  Duration: 00:02:01.54, start: 0.000000, bitrate: 275 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 768x432 [
SAR 1:1 DAR 16:9], 211 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 59
 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : SoundHandler
Output #0, null, to 'pipe:':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.13.103
    Stream #0:0(eng): Video: rawvideo (I420 / 0x30323449), yuv420p, 768x432 [SAR
 1:1 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 25 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> rawvideo)
Press [q] to stop, [?] for help
[null @ 00000000003279a0] Encoder did not produce proper pts, making some up.
[blackdetect @ 0000000004d5e800] black_start:0 black_end:17.08 black_duration:17
.08
[blackdetect @ 0000000004d5e800] black_start:62.32 black_end:121.48 black_durati
on:59.16
frame= 3038 fps=2317 q=0.0 Lsize=N/A time=00:02:01.52 bitrate=N/A
video:285kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.007543%

我对这部分特别感兴趣:

[blackdetect @ 0000000004e2e340] black_start:0 black_end:17.08 black_duration:17.08
[blackdetect @ 0000000004e2e340] black_start:62.32 black_end:121.48 black_duration:59.16

所以我的问题:

  1. 有没有办法只获取 blackdetect 过滤器的输出并将其放入 .txt 文件中?
  2. 如果可能的话,有没有办法在具有多个视频输入的语句中做到这一点?就像在这个例子中一样

示例:

ffmpeg -f concat -i mylist.txt -c copy concat.mp4

其中 mylist.txt 是视频列表:

file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'
file 'video4.mp4'

基本上我想要的是一个或多个文本文件,其中包含有关此列表中每个视频中的黑帧的信息,以供另一个程序使用

【问题讨论】:

  • @LordNeckbeard 谢谢,下次我会记住这一点

标签: ffmpeg


【解决方案1】:

如果使用ffprobe 是可以接受的,现在有一种更简单的元数据注入方法:

ffprobe -f lavfi -i "movie=input.mp4,blackdetect[out0]" -show_entries tags=lavfi.black_start,lavfi.black_end -of default=nw=1 -v quiet

该命令仅输出lavfi 标签black_startblack_end

优点是你还可以获取框架信息等,或者更容易解析的格式的多个标签。

ffprobe 也可以输出 JSON 或 XML,但我找不到跳过没有标签的帧的方法,这些标签会产生空节点。不过,这应该很容易修补。

【讨论】:

  • 目前这给出了一个错误。需要使用ffprobe -f lavfi -i "movie=input.mp4,blackdetect[out0]" ...
  • 在哪里可以找到要使用的有效标签列表?换句话说,你如何打印来自这样一个过滤器的所有信息?
  • 啊哈,那么在这种情况下,BlackDetectContext 及其成员?用关于在哪里可以找到所有这些额外字段的信息来修改你的帖子会很好。 (我来这里不是为了寻找黑色检测,而是一种将过滤器数据输出到文本文件的方法。)
  • @slhck 我不知道我们看到它如何仅与ffprobe 一起工作有多大用处。我自己依靠正则表达式或在fwrite 中修补ffmpeg 用法。有人应该做一个输出过滤器过滤器,初始风格:)
  • 听起来不错 :) 链中的过滤器是否可以访问前一个过滤器的内部变量?我想不会……全局输出过滤器会非常好。好吧,我会把它放在我的愿望清单上(也就是我没有时间的 TODO 清单)。
【解决方案2】:

请参阅aergistal's answer 以获取在做出此答案时不可用的更新、更简单的方法

有没有办法只获取 blackdetect 过滤器的输出并将其放入 .txt 文件中?

默认情况下 ffmpeg 记录到标准错误。您可以输出到stdout,然后使用grep 隔离blackdetect 行:

$ ffmpeg -i video1.mp4 -vf "blackdetect=d=2:pix_th=0.00" -an -f null - 2>&1 | grep blackdetect > output.txt

导致:

$ cat output.txt 
[blackdetect @ 0x1d2b980] black_start:5.16 black_end:10.24 black_duration:5.08 

如果您想附加到output.txt 而不是覆盖每个实例,请使用>> 而不是>,如:blackdetect >> output.txt


有没有办法在具有多个视频输入的语句中做到这一点?

您可以将blackdetectconcat demuxer 一起使用,如您的问题所示,但请注意black_startblack_end 时间将是累积的,并且不独立于每个输入,因为您正在连接所有输入.

如果您希望每个输入独立运行blackdetect,您也可以使用 bash“for 循环”:

for f in *.mp4; do ffmpeg -i "$f" -vf "blackdetect=d=2:pix_th=0.00" -an -f null - 2>&1 | grep blackdetect > "$f".txt; done

这可能会创建空的 txt 文件。

【讨论】:

  • @LordNeckbeard 现在有了ffprobe 和元数据注入的更简单方法
【解决方案3】:

除了上面的代码,你可以很容易地写下面的代码,你会得到一个输出,包括 black_duration 单词和这个单词的行

ffmpeg -i trt1.mp4 -vf blackdetect=d=0.232:pix_th=0.1 -an -f null - 2>&1 | findstr black_duration > output3.txt

ypu 还可以特别过滤黑色持续时间,例如 black_duration:0.233 注意 findstr 管道只对 linux 中的 windows 有效,您可以使用 grep 管道代替 findstr

【讨论】:

    【解决方案4】:

    对于看到这篇文章并希望以与 OP 类似的方式使用 blackdetect 的任何人,我制作了一个 bash 脚本,用于创建基于 aergistal's answer 的 blackdetect 日志。

    GitHub Link

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 2020-10-23
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多