首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何映射用视频的副标题和字幕提取的帧?(帧精度问题)

如何映射用视频的副标题和字幕提取的帧?(帧精度问题)
EN

Stack Overflow用户
提问于 2019-11-12 15:12:09
回答 1查看 1K关注 0票数 1

想要生成文本文件的框架提取与ffmpeg,如果有框架的字幕,如果有的话,在一个视频,我已经刻录的字幕也使用ffmpeg。

我使用带有pysrt的python脚本来打开子文件并生成文本文件。我要做的是,每个帧都用ffmpeg命名,然后,由于它们是以恒定的速率提取的,所以我可以使用公式t1 = fnum/fps轻松地检索帧的时间位置,其中fnum是用文件名检索到的帧数,fps是传递给ffmpeg用于帧提取的频率。

即使我使用相同的字幕文件来检索时间线中的文本位置,也就是视频中使用的文本位置,但我仍然得到了准确性错误。大多数我有一些文本文件丢失或一些不应该出现。

因为在谈到帧时,时间并不是连续的,所以我尝试使用硬编码字幕重新校准t,让我们将fps vfps用于视频fps (我已经确保视频fps在字幕燃烧前后是相同的)。我得到了公式:t2 = int(t1*vfps)/vfps。它仍然不是100%的准确。

例如,我的视频为30 4fps (vfps=30),我在4fps (fps=4)时提取帧。提取的框架166 (fnum=166)不显示字幕。在子文件中,前一个字幕以t_prev=41.330结尾,下一个字幕以t_next=41.400开头,这意味着t_sub应该满足:t_prev < t_sub and t_sub < t_next,但我无法做到这一点。

我尝试过的公式:

代码语言:javascript
复制
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

使用的命令:

代码语言:javascript
复制
# 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

为什么会发生这种情况,我如何解决这个问题?

我注意到的一件事是,如果我提取原始视频和字幕的帧,做一个帧的不同,结果不仅是字幕,还有变化的背景(这不应该发生)。如果我使用相同的视频做两次相同的体验,差别是空的,这意味着帧提取是一致的。

差异代码:

代码语言:javascript
复制
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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-14 16:12:53

您可以使用精确的时间戳提取帧,因此

代码语言:javascript
复制
ffmpeg -i nosub.mp4 -vf subtitles=sub.srt,settb=AVTB,select='if(eq(n\,0)\,1\,floor(4*t)-floor(4*prev_t))' -vsync 0 -r 1000 -frame_pts true extracted/%08d.bmp

这将从每一刻提取第一帧。输出文件名长8个字符,前5个数字是秒,最后三个是毫秒。可以根据最大文件持续时间更改字段大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58821485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档