Как исправить требуемое количество байтов, ошибка чтения 0 байт на moviepy vfx

Я использую moviepy для написания кода, который позволяет мне применять различные изменения vfx к загруженному видеофайлу (обрезка до определенных соотношений сторон, наложение статических изображений и осветление или затемнение видео). Код делает то, что я хочу, но после первых нескольких секунд возвращаемое видео зависает (хотя звук продолжается).

Я искал в Интернете похожие проблемы и не нашел много. https://groups.google.com/forum/#!topic/imageio/kx0R0JQ6RVA предположил, что imageio иногда приходится оценивать количество кадров и https://github.com/Zulko/moviepy/issues/86 предположил, что ffmpeg не может читать некоторые кадры (и что он более подвержен видео с веб-камеры, что и мои файлы).

Моя текущая ошибка: (я получаю ее несколько раз, поэтому я использовал xxx, yyy и zzz для обозначения разных чисел) WARNING:py.warnings: .../moviepy-1.0.0-py3.7.egg/moviepy/video/io/ffmpeg_reader.py:130: UserWarning: Warning: in file /codebase/my_video_file.mp4, xxx bytes wanted but 0 bytes read, at frame yyy/total, at time zzz/total sec. Using the last valid frame instead.

Я успешно обрезаю/осветляю/затемняю/накладываю свои видео, но через несколько секунд видео останавливается (предположительно, каждый кадр после первых нескольких секунд является просто копией предыдущего), а звук продолжается, поэтому я знаю видеофайл продолжает играть.

РЕДАКТИРОВАТЬ (8/14): я обработал видео без каких-либо изменений (поэтому без gamma_corr и без CompositeVideoClip) и все равно получил тот же результат, так что это не ошибка размера кадра.


person nbixler    schedule 08.08.2019    source источник


Ответы (1)


(Предостережение) Я не знаю, всегда ли эта ошибка устраняется решением, к которому я пришел.

Оказывается, я сохранял отредактированное видео по тому же пути, что и входное видео, перезаписывая исходное видео (с чем меня все устраивало). Добавив временное местоположение, а затем переименовав его, я смог использовать тот же путь, избежав проблемы. Теперь я получаю полное видео с видеоэффектами.

vl_sans_mp4 = video_location[0:-4] temp_location = vl_sans_mp4 + "temp" + ".mp4" original_video.write_videofile(temp_location, fps=30, bitrate="90k", audio_bitrate="128k") os.rename(video_location, vl_sans_mp4 + "input" + '.mp4') os.rename(temp_location, video_location)

person nbixler    schedule 14.08.2019