检测视频开头的黑色(纯)帧并将结果写入 TXT

检测视频开头的黑色(纯)帧并将结果写入 TXT

我四处寻找,但就是不明白/对我来说不起作用。我想要一个系统,在 txt 上写入视频开头的黑帧数(总数)(任何类型的视频,x264 x265 等。主要是 .MP4 _ AVC / .MKV _ x264 - x265)。

基本上,如果您使用 Aegisub 打开视频,您可以逐帧滚动并查看黑帧的确切数量(由发布者插入)...问题是要对 100 集进行此操作并传递,最重要的是您必须等待 Aegisub 初始化视频(有时对于某些 BD x265 可能需要 2 分钟)。

因此,流程如下:

  1. 2 个视频,1 个我从中获取字幕,通常是网络/电视轨道(可能没有通常的 24 个黑帧),1 个将用作新的视频轨道(在视频开头可以有 24/42 黑帧)。

  2. 我在 Aegisub 上打开视频(等待 30 秒到 2 分钟);

  3. 我检查黑框的末尾并将结果写在 TXT 上。

TXT 例如:

        Cleo  / Snow-Raws / lovely / The Aster       [24+ = 1001ms]

Ep01: 24+ / 24+ / 0    / 24+
Ep02: 24+ / 0   / 24+  / 0
Ep03: 24+ / 0   / 24+  / 0
Ep04: 24+ / 24+ / 24+  / 24+
Ep05: 24+ / 0   / 24+  / 0
Ep06: 24+ / 0   / 24+  / 0
Ep07: 24+ / 24+ / 24+  / 24+
Ep08: 24+ / 0   / 24+  / 0
Ep09: 24+ / 0   / 24+  / 0
Ep10: 24+ / 24+ / 24+  / 24+
Ep11: 24+ / 0   / 24+  / 0
Ep12: 24+ / 0   / 24+  / 0

0 表示视频立即以非黑色帧(剧集图像)开始。

环顾四周,我找到了一个 AviSynth 脚本,显然它对我来说不起作用(对我来说,事情永远不会按照第一步进行)。

这是脚本:

#Script to find blank frames
#The script outputs the frame number of the first frame that falls below
#the threshold luma value. 

Loadplugin("C:\Program Files (x86)\AviSynth+\plugins\ffms2-2.40-msvc\x64\ffms2.dll")

#Specify the name and location of the output file
filename = "D:\blank_frames.txt"

#Specify the blank threshold. Set to zero for pure black.
global blankthreshold=0

#Specify the name and location of your video file
FFmpegSource2("\\WS2019\Storage5\Anime2\DanMachi\Stagione 02\DanMachi - s02e02 - Cleo + LovelyHestia [TV] - .mkv").killaudio()


#Optional: For analog captures, get rid of the borders.
#          Analog video can have border garbage that affects averageluma
Crop(16,16,-16,-16)

# Use the following to reduce the number of fields by 50% in order to speed processing
separatefields.selectodd

i=last
j=trim(i,1,0) #Previous frame [edit] Actually, it is the NEXT frame

# Temporarily un-comment next line to display the average luma value on screen to help determine threshold value
#ScriptClip(i,"Subtitle(String(AverageLuma(i) ))" )

#This line below will output EVERY frame that is below threshold, which results in LOTS of frames
#Normally you don't do this, but it is included for those who want this capability.
#WriteFileIf(last, filename,  "(AverageLuma(i)<blankthreshold)", "current_frame+1", append = false)

#This is the line that actually writes the frame number of the FIRST frame that falls below the threshold
WriteFileIf(last, filename,  "(AverageLuma(i)<blankthreshold)&&AverageLuma(j)>blankthreshold", "current_frame+1")

#The line below finds the LAST blank frame. 
#WriteFileIf(last, filename,  "(AverageLuma(i)>blankthreshold)&&AverageLuma(j)<blankthreshold", "current_frame+1", append = false)

基本上,脚本“启动”了(我仍然不明白 AviSynth 是如何工作的),但“blank_frames.txt”文件是空的,0kb。我在 Windows 上使用“AviSynth +”以及 AvsPmod 和 MPC-HC/MPC-BE。我也有 AviMeter,但它也什么也没做。

最后,如果您使用 FFmpeg,我还找到了“指南”,但从我看到的,从命令行输出,我不知道如何自动化该过程,以便使用 .bat 将视频放在它上面,它会自动启动命令,然后将视频开头的黑帧数保存在 TXT 中。

链接: https://stackoverflow.com/questions/58971875/is-there-a-way-to-detect-black-on-ffmpeg-video-files

https://stackoverflow.com/questions/18722747/can-you-put-the-result-of-a-blackdetect-filter-in-a-textfile-using-ffmpeg/18726326

https://www.ffmpeg.org/ffmpeg-filters.html#blackframe

因此,我想了解是否有人创建了.exe 或.bat 来执行此操作或如何执行:

  1. 在 Windows 上使用批处理运行此脚本或 ffmpeg 命令行(目前我有用于 audacity 的 ffmpeg);
  2. “自动化”该过程(如果可能的话),以便足以在 .bat 或 .avs(avisynth 脚本)上发布视频,并将在 txt 上找到的黑框保存起来(不一定是 txt,但一些简单的东西也可以,例如:csv、excel 等)。

对于自动化,我只需要知道是否可以做到。我知道 2 3 个“批处理”命令,但我不确定它们在我不了解的 AviSynth / FFmpeg 上使用时是否有效。

听起来很傻,但我注意到这个 AviSynth 脚本启动了整个视频(就像我正常观看一样),我不希望它......直到观看完毕才写入 TXT。它需要做的是检查从第 0 帧到第一个非黑帧(通常不超过 6000 毫秒的视频)有多少黑帧。

提前致谢我希望我没有做错什么。

答案1

感谢 llogan 传递给我“-t 6”,解决方案是:

for %%1 in ("*.mkv") do ffmpeg -i "%%1" -t 6 -vf "blackdetect=d=0.1:pix_th=0.00" -an -f null - 2>&1 | findstr black_duration >> TMS.txt

用于 .bat 拖放;在与拖放文件相同的目录中自动创建一个 TMS.txt,其中用黑色写明每个“* .mkv”的前 6 秒的持续时间。

ffmpeg -i %1 -t 6 -vf "blackdetect=d=0.1:pix_th=0.00" -an -f null - 2>&1 | findstr black_duration >> "%~n1".txt

这会创建一个与输入文件同名的 .txt 文件,并且仅适用于单个文件。

相关内容