想为用ffmpeg提取的帧生成文本文件,包含帧的字幕(如果有的话),在一个视频上,我也用ffmpeg烧录了字幕。你知道吗
我使用带有pysrt
的python脚本打开subrip文件并生成文本文件。
我要做的是,每个帧都用ffmpeg的帧号命名,然后由于它们是以恒定的速率提取的,所以我可以使用公式t1 = fnum/fps
轻松地检索帧的时间位置,其中fnum
是用文件名检索到的帧号,而fps
是传递给ffmpeg用于帧提取的频率。你知道吗
即使我使用相同的字幕文件来检索时间轴中的文本位置,也就是视频中使用的位置,我仍然会得到准确度错误。大多数我有一些文本文件丢失或一些不应该出现。你知道吗
因为在谈论帧时时间并不是真正连续的,所以我尝试使用带有硬编码字幕的视频的fps来重新校准t
,我们称之为视频fps的fps vfps
(我已经确保了视频fps在字幕刻录前后是相同的)。我得到公式:t2 = int(t1*vfps)/vfps
。
它仍然不是100%准确。你知道吗
例如,我的视频是30fps(vfps=30
),而我提取的帧是4fps(fps=4
)。
提取的帧166(fnum=166
)不显示字幕。在subrip文件中,上一个副标题以t_prev=41.330
结束,下一个副标题以t_next=41.400
开始,这意味着t_sub
应该满足:t_prev < t_sub and t_sub < t_next
,但我无法实现这一点。你知道吗
我尝试过的公式:
t1 = fnum/fps # 41.5 > t_next
t2 = int(fnum*vfps/fps)/vfps # 41.5 > t_next
# is it because of a indexing problem? No:
t3 = (fnum-1)/fps # 41.25 < t_prev
t4 = int((fnum-1)*vfps/fps)/vfps # 41.23333333 < t_prev
t5 = int(fnum*vfps/fps - 1)/vfps # 41.466666 > t_next
t6 = int((fnum-1)*vfps/fps + 1)/vfps # 41.26666 < t_prev
使用的命令:
# burning subtitles
# (previously)
# ffmpeg -r 25 -i nosub.mp4 -vf subtitles=sub.srt withsub.mp4
# now:
ffmpeg -i nosub.mp4 -vf subtitles=sub.srt withsub.mp4
# frames extraction
ffmpeg -i withsub.mp4 -vf fps=4 extracted/%05.bmp -hide_banner
为什么会发生这种情况?我该如何解决?你知道吗
我注意到的一件事是,如果我提取原始视频和字幕的帧,对帧做一个差分,结果不仅是字幕,还有背景的变化(这不应该发生)。如果我用同一个视频做了两次同样的体验,差异为空,这意味着帧提取是一致的。你知道吗
差异代码:
ffmpeg -i withsub.mp4 -vf fps=4 extracted/%05.bmp -hide_banner
ffmpeg -i no_sub.mp4 -vf fps=4 extracted_no_sub/%05.bmp -hide_banner
for img in no_sub/*.bmp; do
convert extracted/${img##*/} $img -compose minus -composite diff/${img##*/}
done
谢谢。你知道吗
您可以提取具有准确时间戳的帧,因此
这将从每四分之一秒提取第一帧。输出文件名长度为8个字符,其中前5位是秒,后3位是毫秒。您可以根据最大文件持续时间更改字段大小。你知道吗
相关问题 更多 >
编程相关推荐