Скрипт для вырезания видео по тихой части с FFMPEG - PullRequest
1 голос
/ 09 февраля 2020

Это вопрос, который поднимается здесь Как разделить видео или аудио по тихим частям или здесь Как можно разделить видео mp4 с помощью ffmpeg каждый раз, когда громкость равна нулю?

Так что я смог придумать простой bash скрипт, который работает на моей маме c.

Вот оно (единственный аргумент - это название видео, которое нужно вырезать , он сгенерирует файл start_timestamps.txt со списком запусков тишины, если файл не существует, и повторно использует его в противном случае):

#!/bin/bash

INPUT=$1

filename=$(basename -- "$INPUT")
extension="${filename##*.}"
filename="${filename%.*}"

SILENCE_DETECT="silence_detect_logs.txt"
TIMESTAMPS="start_timestamps.txt"

if [ ! -f $TIMESTAMPS ]; then
    echo "Probing start timestamps"
    ffmpeg -i "$INPUT" -af "silencedetect=n=-50dB:d=3" -f null - 2> "$SILENCE_DETECT"
    cat "$SILENCE_DETECT"| grep "silence_start: [0-9.]*" -o| grep -E '[0-9]+(?:\.[0-9]*)?' -o > "$TIMESTAMPS"
fi

PREV=0.0
number=0

cat "$TIMESTAMPS"| ( while read ts
do
    printf -v fname -- "$filename-%02d.$extension" "$(( ++number ))"
    DURATION=$( bc <<< "$ts - $PREV")
    ffmpeg -y -ss "$PREV" -i "$INPUT" -t "$DURATION" -c copy "$fname"
    PREV=$ts
done
printf -v fname -- "$filename-%02d.$extension" "$(( ++number ))"
ffmpeg -y -ss "$PREV" -i "$INPUT" -c copy "$fname" )

К сожалению, он не работает:

У меня есть видео, которое в основном представляет собой набор клипов, каждый клип представляет собой примерно 5-секундную паузу с рамкой stati c с заголовком. Поэтому я хочу вырезать оригинальное видео так, чтобы каждый фрагмент представлял собой 5 секунд «введение» + видео до следующего представления. Надеюсь, это понятно.

Во всяком случае, в моем скрипте я сначала нахожу все silence_start, используя плагин ffmpeg silencedetect. Я получаю start_timestamps.txt, который гласит:

141.126
350.107
1016.07
etc.

Затем, например, я бы позвонил (мне не нужно перекодировать видео), зная, что (1016.07 - 350.107) = 665.963

ffmpeg -ss 350.107 -i Some_video.mp4 -t 665.963 -c copy "Some_video02.mp4"

Пограничными вариантами являются первый фрагмент, который должен go от 0 до 141.126, и последний фрагмент, который должен go от последней отметки времени до конца видео.

В любом случае start_timestamps кажись ле git. Но мои выходные куски совершенно неверны. Иногда видео даже не проигрывается в Quicktime. У меня даже нет кадра stati c с заголовком в любом из видео ...

Надеюсь, кто-нибудь может помочь. Спасибо.

РЕДАКТИРОВАТЬ Хорошо, как объяснено в комментариях, если я повторяю $ PREV при комментировании команды ffmpeg, я получаю список значений le git идеально:

0.0
141.126
350.107
1016.07
etc.

С помощью команды ffmpeg я получаю:

0.0
141.126
50.107
016.07
etc.

bash изменения переменных в l oop с помощью ffmpeg показывает, почему.

мне просто нужно добавить </ dev / null к команде ffmpeg или добавить аргумент -nostdin. Спасибо всем. </p>

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