Использование MoviePy для исправления нефинализированного видео.flv
Во время записи экрана с помощью захвата OBS я накопил большое количество видеороликов, которые были вынуждены отключить систему, оставив их незавершенными. Видео были созданы в формате.flv, поэтому, когда я воспроизводил их в VLC Player, они воспроизводились безупречно, однако им не хватало времени окончания (длительности видео). Вместо этого, видео показывают время воспроизведения во время воспроизведения, но сохраняют время окончания 00:00, несмотря на фактическое воспроизведение видео в течение нескольких минут.
https://stackru.com/images/9a809285dbad13608675c56acdfa12cc4 ff33f2c.png
Насколько я понимаю, в отличие от форматирования.mp4, видео в формате.flv должно быть в состоянии быть восстановлено, если оно не было завершено (как в случае, когда мои кадры были остановлены из-за неожиданного выключения). Поскольку у меня есть большое количество незавершенных, мне нужно автоматизированное решение, чтобы исправить их.
Использование MoviePy write_videofile
Я попытался исправить видео с помощью MoviePy write_videofile
команда в оболочке python с каталогом, установленным в каталог плохого видео:
from moviepy.editor import * #no error
vid = VideoFileClip("oldVideoName.flv") #no error
vid.write_videofile("corrected.mp4") #IndexError
Последняя созданная строка кратко создала файл "correctedTEMP_MPY_wvf_snd.mp3"(только 1 КБ, не воспроизводимый в Audacity), незадолго до создания исключения. Я получил массивную трассировку с последним чтением:
File "\Python37-32\lib\site-packages\moviepy\audio\io\readers.py", line 168, in get_frame
"Accessing time t=%.02f-%.02f seconds, "%(tt[0], tt[-1])+
IndexError: index 0 is out of bounds for axis 0 with size 0
Я предположил, что это было вызвано проблемой с аудио-ридером, не принимающим предполагаемую отметку времени 00:00 как длину видео.
Использование MoviePy subclip
Я попытался посмотреть, есть ли способ, которым я мог бы вручную подать MoviePy метки времени начала и окончания, используя subclip
метод. Я знаю, что видео длится не менее 4 секунд, поэтому я использовал его в качестве контрольного теста:
clip = vid.subclip("00:00:00", "00:00:05") #no error
clip.write_videofile("corrected.mp4") #OSError
Метод write_videofile снова выдал исключение:
File "\Python37-32\lib\site-packages\moviepy\audio\io\readers.py", line 169, in get_frame
"with clip duration=%d seconds, "%self.duration)
OSError: Error in file oldVideoName.flv,
Accessing time t=0.00-0.04 seconds, with clip duration=0 seconds,
Даже если бы этот метод работал, мне нужно было бы найти способ автоматизировать процесс определения времени окончания видео.
Использование OpenCV CAP_PROP_FRAME_COUNT
Одним из возможных решений для определения времени окончания (длительности видео) является использование cv2, согласно этому посту.
import cv2 #no error
vid=cv2.VideoCapture("oldVideoName.flv") #no error
vid.get(cv2.CAP_PROP_FRAME_COUNT) #returns -5.534023222112865e+17
Я не ожидал получить отрицательное число с плавающей запятой для этого значения. Дальнейшие тесты показывают мне, что это число не соответствует длине видео, так как все нефинализированные видео возвращают одно и то же число для этого запроса. (Обычные видео возвращают свою длину для этого вызова метода). Это полезно для перебора каталога, определяющего незавершенные видео.
Является ли использование MoviePy для исправления большого количества незавершенных видео жизнеспособным или даже возможным решением? Лучше ли использовать cv2 (Python OpenCV) для решения этой проблемы?
0 ответов
Мне удалось исправить видеофайлы с помощью yamdi, инжектора метаданных с открытым исходным кодом для файлов FLV. После загрузки и установки yamdi я могу использовать следующую команду для восстановления файла.flv с именемoldVideoName.flv
:
yamdi -i oldVideoName.flv -o corrected.flv
Команда уходит oldVideoName.flv
нетронутым, и сохраняет восстановленный файл как corrected.flv
.