хотел бы сгенерировать текстовые файлы для кадров, извлеченных с помощью ffmpeg, содержащие субтитры кадра, если они есть, на видео, для которого я также записал субтитры с помощью ffmpeg.
Я использую сценарий python с pysrt
, чтобы открыть файл subrip и создать текстовые файлы. Что я делаю, так это то, что каждому кадру присваивается имя с номером кадра с помощью ffmpeg, а затем, поскольку они извлекаются с постоянной скоростью, я могу легко получить временную позицию кадра, используя формулу t1 = fnum/fps
, где fnum
- номер кадра кадр, полученный с именем файла, а fps
- частота, передаваемая в ffmpeg для извлечения кадра.
Несмотря на то, что я использую тот же файл субтитров для извлечения позиций текста на временной шкале, который использовался в видео, я все равно получаю ошибки точности. В большинстве случаев у меня отсутствуют некоторые текстовые файлы или их не должно быть.
Поскольку время на самом деле не непрерывно, когда речь идет о кадрах, я попытался перекалибровать t
, используя fps видео с жестко закодированными субтитрами, назовем это fps vfps
для видео fps (я убедился, что частота кадров видео до и после субтитров одинакова. горение). Получаю формулу: t2 = int(t1*vfps)/vfps
. Это все еще не на 100% точно.
Например, у меня видео с частотой 30 кадров в секунду (vfps=30
), и я извлекал кадры со скоростью 4 кадра в секунду (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
Спасибо.
ffmpeg -i nosub.mp4 -vf subtitles=sub.srt withsub.mp4
, но он изменил частоту с 25 на 30, поэтому я вручную установил частоту кадров, и мне кажется, что это неправильно. Я не большой пользователь ffmpeg. Я искал в Google, как сохранить частоту кадров с помощью ffmpeg, и нашел этот заголовок superuser.com/questions/460332/, но нет принятого ответа. - person Nick Skywalker   schedule 13.11.2019t_prev*fps=165.32
иt_next*fps=165.6
, что подразумевает, что если кадр, извлеченный с помощью ffmpeg, является коэффициентом1/fps
, тогда я не должен получать кадр 166 для находиться между двумя субтитрами, но вместо этого отображать второй (или, возможно, предыдущий). То же самое при корректировке по fps видео:int(t_next*vfps)*fps/vfps=165.2
,int(t_next*vfps)*fps/vfps=165.6
- person Nick Skywalker   schedule 13.11.2019