Это вопрос, который поднимается здесь Как разделить видео или аудио по тихим частям или здесь Как можно разделить видео 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>