Ошибка при работе с moviepy

Рейтинг: 1Ответов: 1Опубликовано: 25.04.2023

Необходимо обрезать видео если оно длиной больше 30 секунд (с 30 секудны и до конца видео отрезок не нужен ,также длина видео разная поэтому точное значение окончания видео не известно и меняется).

При запуске кода (ниже) происходит только две вещи:

  1. Cохраняется только аудио (даже если добавляю кодек), либо вообще выдает ошибку, что не удалось определить длину видео.
    ОС windows 10, ffmpeg установлен (судя по документации, ставится автоматом, также скачал еще один новой версии и в конфиге сделал к нему путь)
  2. Появляется куча ошибок от библиотеки.

Требуется только обрезка видео если оно длительностью более определенного времени (30-60 сек). Может есть какие-то другие библиотеки для этой цели ?

from moviepy.editor import VideoFileClip, CompositeVideoClip, concatenate_videoclips , clips_array, vfx, AudioFileClip
import ffmpeg
import os

# пишем путь к файлу
files = os.listdir("C:\\Users\\Пользователь\\Desktop\\eredità\\AvtoTT\\videos\\")

# создаем пустой список в переменной video , в которую будет передаваться имя файла
video = []

# цикл for с переменной videos (новая переменная ,которая будет перебирать значения(видосы) в папке с видео

for videos in files:
    print(videos)
    if videos.endswith(".mp4"):  # если строка которую мы передаем в videos  заканчивается на vid
        video.append(videos)  # то передаем в конец списка
if len(video) == 0:  # len() - количество элементов в списке ,если значение равно 0 ,то это ошибка
    print('ошибка/n')
else:  # если в списке имеется видео  ,то запускается цикл
    for videos in video:
        print("пошел процесс...")
        # выясняем длину видео
        video = VideoFileClip("C:\\Users\\Пользователь\\Desktop\\eredità\\AvtoTT\\videos\\" +videos)
        # обрезаем видео с 30 секунд до конца (round функция ,которая округляет число )
        video = video.cutout(15,round(30))
        # сохранение нового видео в файле
        video.write_videofile("videos\\vid.mp4"+videos , fps=30,)

ошибки которые выдает :

Moviepy - Building video videos\vid0.mp4.
MoviePy - Writing audio in vid0TEMP_MPY_wvf_snd.mp3
t:   0%|          | 0/900 [00:00<?, ?it/s, now=None]MoviePy - Done.
Moviepy - Writing video videos\vid0.mp4

Traceback (most recent call last):
  File "D:\python\Lib\site-packages\moviepy\video\io\ffmpeg_writer.py", line 136, in write_frame
    self.proc.stdin.write(img_array.tobytes())
BrokenPipeError: [Errno 32] Broken pipe

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Пользователь\Desktop\eredità\Pes.py", line 31, in <module>
    video.write_videofile("videos\\"+videos , fps=30)
  File "<decorator-gen-55>", line 2, in write_videofile
  File "D:\python\Lib\site-packages\moviepy\decorators.py", line 54, in requires_duration
    return f(clip, *a, **k)
           ^^^^^^^^^^^^^^^^
  File "<decorator-gen-54>", line 2, in write_videofile
  File "D:\python\Lib\site-packages\moviepy\decorators.py", line 135, in use_clip_fps_by_default
    return f(clip, *new_a, **new_kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<decorator-gen-53>", line 2, in write_videofile
  File "D:\python\Lib\site-packages\moviepy\decorators.py", line 22, in convert_masks_to_RGB
    return f(clip, *a, **k)
           ^^^^^^^^^^^^^^^^
  File "D:\python\Lib\site-packages\moviepy\video\VideoClip.py", line 300, in write_videofile
    ffmpeg_write_video(self, filename, fps, codec,
  File "D:\python\Lib\site-packages\moviepy\video\io\ffmpeg_writer.py", line 228, in ffmpeg_write_video
    writer.write_frame(frame)
  File "D:\python\Lib\site-packages\moviepy\video\io\ffmpeg_writer.py", line 180, in write_frame
    raise IOError(error)
OSError: [Errno 32] Broken pipe

MoviePy error: FFMPEG encountered the following error while writing file videos\vid0.mp4:

 b'videos\\vid0.mp4: No such file or directory\r\n'
                                                    
Process finished with exit code 1

Ответы

▲ 1Принят

В общем проблема была с названием текущего файла "video" (совпадало с названием списка "video"). рабочий код:

        # Импортируем библеотеки
from moviepy.editor import VideoFileClip, CompositeVideoClip, concatenate_videoclips , clips_array, vfx, AudioFileClip
import ffmpeg
import os

# пишем путь к файлу
files = os.listdir("путь")

# создаем пустой список в переменной video , в которую будет передаваться имя файла
video = []
i= 0
# цикл for с переменной videos (новая переменная ,которая будет перебирать значения(видосы) в папке с видео

for videos in files:
    print(videos)
    if videos.endswith(".mp4"):  # если строка которую мы передаем в videos  заканчивается на vid
        video.append(videos)  # то передаем в конец списка
if len(video) == 0:  # len() - количество элементов в списке ,если значение равно 0 ,то это ошибка
    print('ошибка/n')
else:  # если в списке имеется видео  ,то запускается цикл

    for videos in video:
        print("пошел процесс...")
        # выясняем длину видео и обрезаем 

     a = VideoFileClip("путь" +videos)
        
        if a.duration > 30:
           a = a.subclip(0, 30)
           print (a)
        # сохранение нового видео в файле
        a.write_videofile(f"C:\\Users\\Пользователь\\Desktop\\eredità\\AvtoYT\\готовое\\vid{i}.mp4" , fps=30)
        if i == i:
            i+=1 "

Отдельная благодарность- CrazyElf за помощь с решением вопроса .