问题描述
我正在测试ffmpeg中的"blackdetect"过滤器.我想有一段视频是黑色的,可以通过脚本(例如动作脚本或javascript)读取.我试过了:
I'm testing out the "blackdetect" filter in ffmpeg. I want to have the times when the video is black to be read by a script (like actionscript or javascript). I tried:
ffmpeg -i video1.mp4 -vf "blackdetect=d=2:pix_th=0.00" -an -f null -
在ffmpeg日志中,我得到了一个不错的结果:
And I get a nice result in the ffmpeg log:
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%
我对这部分特别感兴趣:
And I'm particularly interested in this part:
[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
所以我的问题:
- 有没有办法只将blackdetect过滤器的输出放到.txt文件中?
- 如果可能的话,有没有一种方法可以在具有多个视频输入的语句中执行此操作?就像在这个例子中一样
示例:
example:
ffmpeg -f concat -i mylist.txt -c copy concat.mp4
mylist.txt是视频列表:
Where mylist.txt is a list of videos:
file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'
file 'video4.mp4'
我基本上想要的是一个或多个文本文件,其中包含有关此列表中每个视频中黑框的信息,供其他程序使用
Basically what I want to have is one or more text files containing information about the black frames in every video in this list to be used by another program
推荐答案
默认情况下,ffmpeg记录到stderr.您可以输出到stdout
,然后使用grep
隔离 blackdetect
行:
By default ffmpeg logs to stderr. You can output to stdout
and then use grep
to isolate the blackdetect
lines:
$ 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
.
If you want to append to output.txt
instead of overwriting for each instance then use >>
instead of >
, as in: blackdetect >> output.txt
.
您可以将blackdetect
与 concat
多路分解器结合使用,但是您的问题所示请注意,black_start
和black_end
时间将是累积时间,而不是独立于每个输入,因为您正在串联所有输入.
You can use blackdetect
with the concat
demuxer as shown in your question, but be aware that the black_start
and black_end
times will be cumulative, and not independent to each input, because you are concatenating all inputs.
或者,如果您希望每个输入都通过blackdetect
独立运行,则可以使用bash"for循环":
Alternatively you can use a bash "for loop" if you want each input to be independently run through blackdetect
:
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文件.
This may create empty txt files.
这篇关于您可以使用ffmpeg将blackdetect过滤器的结果放入文本文件中吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!