Использование MoviePy для исправления нефинализированного видео .flv - PullRequest
0 голосов
/ 14 февраля 2019

Во время записи экрана с помощью захвата OBS я накопил большое количество видеороликов, которые были принудительно закрыты, оставив их незапертыми.Видео были созданы в формате .flv, поэтому, когда я воспроизводил их в VLC Player, они воспроизводились безупречно, однако им не хватало времени окончания (длительности видео).Вместо этого видео показывает время воспроизведения во время воспроизведения, но сохраняет время окончания 00:00, несмотря на фактическое воспроизведение видео в течение нескольких минут.

Playbar of unfinalized video

Насколько я понимаю, в отличие от форматирования .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)?

1 Ответ

0 голосов
/ 07 мая 2019

Мне удалось исправить видеофайлы с помощью yamdi , инжектора метаданных с открытым исходным кодом для FLV-файлов.После загрузки и установки yamdi я могу использовать следующую команду для восстановления файла .flv с именем oldVideoName.flv:

yamdi -i oldVideoName.flv -o corrected.flv

Команда оставляет oldVideoName.flv нетронутым и сохраняетвосстановленный файл как corrected.flv.

...