Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve audio concat; cleanup temp files; add -T(temp_dir) and -P (video_pool_size) args #1

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

vvd170501
Copy link

No description provided.

@@ -1,13 +1,14 @@
#!/usr/bin/python
#!/usr/bin/env python
Copy link
Author

@vvd170501 vvd170501 Oct 23, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поменял, чтобы скрипт нормально работал в virtualenv

main.py Outdated

logging.info("Trimming audio")
segments = AudioSegment._sync(*[audio[start:stop] for start, stop in parts])
trimmed_audio = segments[0]._spawn([segment._data for segment in segments])
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше использовать приватные методы класса, чем собирать весь аудиофрагмент за O(N^2) (каждый += создавал новый AudioSegment)

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, спасибо, звучит как и правда хорошая оптимизация
Жалко, что приходится лезть в приватные методы

main.py Outdated
return True


def process_chunk(workdir, args, total_segments, id, segment):
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Раньше workdir, args и segments были глобальными и объявлялись в конце скрипта, из-за этого код было сложнее понимать.

@vvd170501 vvd170501 changed the title Improve audio concat; cleanup temp files; add -T(temp_dir) arg Improve audio concat; cleanup temp files; add -T(temp_dir) and -P (video_pool_size) args Oct 23, 2022
help='number of audio chunks to be processed concurrently', default=1)
parser.add_argument('-P', dest='video_pool_size', type=int,
help='number of video chunks to be processed concurrently. '
'FFmpeg (without hwaccel) uses optimal number of threads by default, '
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проверял с ffmpeg 4.4.2-0ubuntu0.22.04.1, количество используемых потоков равно кол-ву физических ядер процессора.
Запуск нескольких одновременно выполняющихся процессов ffmpeg не улучшает производительность, а наоборот, немного ухудшает её.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

*Относится только к предпоследней стадии - trim+concat для каждого чанка.
Для разделения видео и аудио потоков и обработки аудио в каждом чанке используется 1 поток, поэтому на этих этапах нет проблем с параллельным исполнением.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо
Тоже хотел протестить, но никак не доходили руки
Кажется, когда добавлял эту опцию, тестил и использование многопоточности было оправданным
Сам ещё побенчмаркаю

ffmpeg по дефолту запускается с опцией threads=-1, поэтому звучит правдоподобно, что процесс будет занимать все ядра и будет конкурировать с другими

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vvd170501, а какой порядок улучшений времени? Остались результаты замеров?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Замерил на 30 минутах лекции в качестве 1080p60.
CPU - Ryzen 7 5800HS (8 физических ядер).
Разбиение на чанки и обработка аудио во всех случаях занимали ~8 секунд.

С одним процессом ffmpeg (5a04dcc):

$ time ./main.py -s 150 -m 50 -n 8 -p 8 -T /tmp/ramdisk/ -i ls4_30min.mkv -o lec4_trimmed.mkv
real	6m10,282s
user	50m56,566s
sys	0m46,125s

Во время выполнения trim+concat каждое из 16 логических ядер используется на ~50%, ffmpeg использует ~1 ГБ памяти, load average (1min) ~=9.

С 8 параллельными процессами ffmpeg (c9bc294):

$ time ./main.py -s 150 -m 50 -n 8 -p 8 -T /tmp/ramdisk/ -i lec4_30min.mkv -o lec4_trimmed.mkv
real	7m25,505s
user	110m17,434s
sys	1m48,683s

Все логические ядра загружены на 100%, используется 8 ГБ памяти, load average (1min) ~=70.

C ускорением на RTX 3060 mobile (мб попробую сделать PR, но нужно как-то добавить проверку на доступность nvenc):

$ time ./main.py -s 150 -m 50 -n 8 -p 8 -P 2 -T /tmp/ramdisk/ -i lec4_30min.mkv -o lec4_trimmed.mkv
real	2m22,735s
user	2m0,605s
sys	0m8,618s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants