Следуй за мной на YouTube и Twitter Для получения дополнительных видеомагнитофонов с FFMPEG и немного Python в настоящее время!
Я недавно обновил свой скрипт Python для автоматического удаления частей тишины видео.
Ранее я должен был вызвать скрипт Shell отдельно, чтобы создать временные метки тишины.
Теперь сценарий Python выталкивает вывод скрипта оболочки, непосредственно с помощью подпроцесса.
Скрипт
#!/usr/bin/env python import sys import subprocess import os from moviepy.editor import VideoFileClip, concatenate_videoclips input_path = sys.argv[1] out_path = sys.argv[2] threshold = sys.argv[3] duration = sys.argv[4] try: ease = float(sys.argv[5]) except IndexError: ease = 0.2 minimum_duration = 1.0 def generate_timestamps(path, threshold, duration): command = "detect_silence {} {} {}".format(input_path, threshold, duration) output = subprocess.run(command, shell=True, capture_output=True, text=True) return output.stdout.split('\n')[:-1] def main(): count = 0 last = 0 timestamps = generate_timestamps(input_path, threshold, duration) print("Timestamps: {}".format(timestamps)) video = VideoFileClip(input_path) full_duration = video.duration clips = [] for times in timestamps: end,dur = times.strip().split() print("End: {}, Duration: {}".format(end, dur)) to = float(end) - float(dur) + ease start = float(last) clip_duration = float(to) - start # Clips less than one seconds don't seem to work print("Clip Duration: {} seconds".format(clip_duration)) if clip_duration < minimum_duration: continue if full_duration - to < minimum_duration: continue print("Clip {} (Start: {}, End: {})".format(count, start, to)) clip = video.subclip(start, to) clips.append(clip) last = end count += 1 if not clips: print("No silence detected, exiting...") return if full_duration - float(last) > minimum_duration: print("Clip {} (Start: {}, End: {})".format(count, last, 'EOF')) clips.append(video.subclip(last)) processed_video = concatenate_videoclips(clips) processed_video.write_videofile( out_path, fps=60, preset='ultrafast', codec='libx264', audio_codec='aac' ) video.close() main()
Я не буду проходить через это в полной мере, так как я сделал это в последнем посте о скрипте обрезки тишины. Я сломаю изменения, которые я сделал.
Для разрыва скриптов более подробно проверим последнее сообщение, которое я сделал об этом.
Автоматически обрезать тишину от видео с ffmpeg и python
Дональд Фейринг · 9 мая ’20 · 4 мин прочитаны
Изменения
def generate_timestamps(path, threshold, duration): command = "detect_silence {} {} {}".format(input_path, threshold, duration) output = subprocess.run(command, shell=True, capture_output=True, text=True) return output.stdout.split('\n')[:-1]
Здесь я создал функцию, чтобы пройти в аргументах, необходимых сценарии обнаружения тишины, и выполнить его, используя подпрокат.
Это нужна capture_output = true.
на самом деле сохранить вывод, а текст = Правда
Чтобы выводиться в форме строки, в противном случае ее возвращаются как необработанные байты.
Затем я разделился на новинки и удалите последнюю запись, так как ее пустая строка, которая не требуется.
Поскольку мы сбиваем вывод скрипта прямо из STDOUT, нам больше не нужно открывать и читать произвольный текстовый файл для получения временных метров.
Последнее изменение было, прежде чем я добавлял прокладку до начала следующего зажима, чтобы сделать переходы менее крутой. Теперь добавляю его конец последнего клипа, так как кажется более естественным.
if not clips: print("No silence detected, exiting...") return
Я также добавил эту проверку здравомыслия, чтобы убедиться, что на самом деле были сгенерированные клипы, не могут объединить клипы, которые не существуют.
Вот и все! Теперь я могу удалить частей тишины видео, вызывая только сценарий! Он также позволяет избежать необходимости создавать прерывистый файл Timestamp.
Оригинал: “https://dev.to/dak425/a-update-to-my-automated-silence-trimming-script-1d4d”