我正在测试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
所以我的问题:
示例:
ffmpeg -f concat -i mylist.txt -c copy concat.mp4
其中mylist.txt是视频列表:
file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'
file 'video4.mp4'
基本上我想要的是一个或多个文本文件,其中包含有关此列表中每个视频中的黑色帧的信息,以供其他程序使用
答案 0 :(得分:9)
如果使用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_start
和black_end
。
优点是您还可以获取帧信息等,或者以更易于解析的格式显示多个标签。
ffprobe
也可以输出JSON或XML,但我找不到跳过没有产生空节点的标签的帧的方法。这应该很容易修补。
答案 1 :(得分:8)
有没有办法只采用blackdetect过滤器输出并将其放在.txt文件中?
默认情况下,ffmpeg会记录到stderr。您可以输出到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
。
有没有办法在包含多个视频输入的语句中执行此操作?
您可以将[{1}}与问题中显示的concat
demuxer一起使用,但要注意blackdetect
和black_start
次是累积的,并且不是独立的输入,因为你连接所有输入。
如果您希望每个输入都通过black_end
独立运行,您可以使用bash“for循环”:
blackdetect
这可能会创建空的txt文件。
答案 2 :(得分:0)
除了上面的代码,您还可以轻松地编写下面的代码,您将获得包含 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