Рубрики
Без рубрики

Обновление для моей автоматической обрезки тишины

Следуй за мной на YouTube и Twitter для получения дополнительных видеомагнитофонов с FFMPEG и маленьким питоном … Помечено FFMPEG, Python, производительность, Linux.

Следуй за мной на 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”