Python Mov ie .py - Как мне обрабатывать (освобождать / закрывать) больше не используемые клипы? - PullRequest
0 голосов
/ 06 апреля 2020

Ожидается

  1. Создать ImageClips различной продолжительности и добавить:
    clips = [] (строка 13-16)
  2. Создать ImageClips в сцепленный клип:
    concatenated_videoclips(clips, method="chain") (строка 19)
  3. Добавить аудио в сцепленный клип (строка 20-21)
  4. Прокручивает список файлов изображений и удаляет их из памяти (не в примере кода)
  5. L oop по списку clips = [<ImageClip>] и закрывает каждый клип, затем удаляет из списка (строка 24-29)
  6. Возврат сцепленного клипа (строка 32) и добавление к другому списку в глобальной области видимости (не в примере кода)
  7. Повторите шаги 1-6
  8. Объедините все клипы, которые были добавлены в глобальный список, затем set_audio(background_music_path.mp3) (не в примере кода)
  9. Новое видео записано new_video_path.mp4 (не в примере кода) Цитата

Фактический

  • 5% времени проходит через процесс правильный вывод видео
  • 95 % времени будет равняться sh из-за убитых: 9 или пропущенная ошибка семафора
  • К концу процесса достигает 120 ГБ в мониторе активности до Python venv прекращено
  • Использование Tracemallo c module показывает линейное увеличение использования памяти, когда:
    • Добавление нового ImageClips относится к:
      1. imageio / plugins / pillow.py (обертка imageio python)
      2. moviepy / video / VideoClip.py (из class ImageClip(VideoClip):)
    • объединение clips список ImageClips :
    • numpy / lib / shape_base.py

Использование памяти Tracemalloc

Сразу после первого создания ImageClips:

#1
/venv/lib/python3.8/site-packages/moviepy/video/VideoClip.py:900: 293626.7 KiB
1.0 * img[:, :, 3] / 255, ismask=True)
#2
/venv/lib/python3.8/site-packages/imageio/plugins/pillow.py:792: 146813.8 KiB
frame = np.array(frame, dtype=dtype)

После того, как первый ImageClips объединены вместе:

#1
/venv/lib/python3.8/site-packages/moviepy/video/VideoClip.py:900: 293626.7 KiB
 1.0 * img[:, :, 3] / 255, ismask=True)
#2
/venv/lib/python3.8/site-packages/numpy/lib/shape_base.py:1256: 234900.2 KiB
 c = c.reshape(-1, n).repeat(nrep, 0)
#3
/venv/lib/python3.8/site-packages/imageio/plugins/pillow.py:792: 146813.8 KiB
frame = np.array(frame, dtype=dtype)

После нескольких итераций объединения ImageClips:

#1
/venv/lib/python3.8/site-packages/moviepy/video/VideoClip.py:900: 32709961.1 KiB
 1.0 * img[:, :, 3] / 255, ismask=True)
#2
/venv/lib/python3.8/site-packages/imageio/plugins/pillow.py:792: 16355008.3 KiB
 c = c.reshape(-1, n).repeat(nrep, 0)
#3
/venv/lib/python3.8/site-packages/numpy/lib/shape_base.py:1256: 6107405.9 KiB
frame = np.array(frame, dtype=dtype)

CODE ПРИМЕР

1  import random
2
3  # Moviepy library
4  from moviepy.editor import concatenate_videoclips
5  from moviepy.video.VideoClip import ImageClip
6  from moviepy.audio.io.AudioFileClip import AudioFileClip
7
8  def make_movie(img_files):
9     # List to hold all of the ImageClips
10    clips = []
11
12    # Loop through the image files and create ImageClip with random duration
13    for img in img_files:
14      duration = random.randomint(0,3)
15      with ImageClip(img, duration=duration) as img_clip:
16        clips.append(img_clip)
17
18    # Concatenate all of ImageClips in clips and save to all_clips (audio for example sake)
19    with concatenate_videoclips(clips, method="chain") as all_clips:
20      with AudioFileClip(audio_file_path.mp3) as audio_clip:
21        all_clips = all_clips.set_audio(audio_clip)
22
23    # Loop through list of clips and close individually 
24    for used_clip in clips:
25      used_clip.close()
26    
27    # Delete all clips in list
28    while len(clips) > 0:
29      del clips[0]
30    
31    # Return concatenated clip 'all_clips'
32    return all_clips
33
34

Конечный результат

  • После возврата all_clips будет добавлен в список, который в конечном итоге будет объединен еще раз для создания окончательного видеоклипа
  • Проблема в том, что программе больше не нужны все фрагменты изображений после их использования, и оказалось трудным освободить их от памяти

Настройка системы

  • macOS
  • MoviePy 1.0.2

Заранее спасибо за любые предложения! 11

1 Ответ

0 голосов
/ 07 апреля 2020

Вы можете использовать многопроцессорную библиотеку Python. Выполните каждый вызов make_movie() внутри отдельного процесса, и память должна быть освобождена после завершения функции. Вы также можете записать каждого отдельного all_clips на диск, используя all_clips.write_videofile(), и снова прочитать их все в конце, когда вы захотите создать финальное видео.

Дайте мне знать, если у вас есть другие проблемы.

...