Я ищу программу, которая может разбить фильм на части в зависимости от смены сцены. Так что если фильм состоит из лесного пейзажа и рыб в аквариуме, то я хочу получить два фильма: первый о лесе, второй о рыбах. Предпочтительно программа доступна под Linux и имеет интерфейс командной строки
4 ответа
Все, что я мог найти до сих пор:
Программа
lav2yuv
может обнаружить изменения сцены:-S list.el Output a scene list with scene detection
Чтобы это работало, вам нужно конвертировать ваши видео файлы в MJPEG перед:
ffmpeg -i source.avi -an -vcodec mjpeg destination.avi
- Есть заброшенное программное обеспечение, которое называется shotdetect. Это единственная программа для командной строки и с открытым исходным кодом, которую я когда-либо нашел, но я ожидаю, что она не будет работать для большинства видео.
Я нашел этот пост несколько дней назад в поисках решения для автоматического разделения клипов. Я закончил тем, что сделал сценарий bash. Надеюсь, что это кому-то поможет, так как мой поиск в Google привел меня сюда в первую очередь, и я уже был участником обмена стека, я решил опубликовать его здесь, надеясь, что это поможет кому-то еще.
Я не знаю, имею ли я право поставить заявление об отказе от ответственности, но вам сообщат, что оно дается без гарантии, и если вы (или это) что-то напутали, я не несу ответственности. Это один из моих первых сценариев, и у меня очень мало опыта в bash, так что, если гуру bash хотят изменить это еще больше, пожалуйста, подумайте.Не стесняйтесь изменять, делиться и использовать скрипт.
Использование: sh ./scenesplit.sh inputfile.mp4
- Скрипт создаст папку с именем входного файла в текущем пути и выведет вырезанные сцены в нем
- Это создаст файл с showinfo из ffmpeg
- Из этого файла он выведет другой файл с отметкой времени каждого обнаружения
- Затем скрипт зациклит ffmpeg, чтобы создать серию клипа в соответствии с файлом временной метки. Первый клип начинается с 0 и заканчивается на первой отметке времени. Последний клип начинается с последней отметки времени и заканчивается концом исходного клипа.
- Будет спать второй каждую сцену.
Вы можете настроить «чувствительность» обнаружения, изменив значение gt(scene,0.1)
. Должен быть значением между 0 и 1. Они рекомендуют (как говорится, в здравом уме) от 0,4 до 0,6, но 0,1 прекрасно работает для меня.
Выходной кодек установлен в mp4 со звуком aac на скорости 30 кадров в секунду 720p.
Работайте как положено (для меня) с файлами mp4. Не тестировал ни с одним другим кодеком.
#/bin/bash
start=0;
count=0;
in="$1"
bn="$(basename "$in")"
echo "=============================================================================="
echo "FILE START: $bn"
mkdir "./$bn"
echo "Finding Scene... this might take a while..."
ffmpeg -nostdin -i "$in" -filter:v "select='gt(scene,0.1)',showinfo" -f null - 2>"./$bn/ffout.tmp.txt"
echo "Filtering timestamp... this might take a while..."
grep showinfo "./$bn/ffout.tmp.txt" | grep pts_time:[0-9.]* -o | grep '[0-9]*\.[0-9]*' -o > "./$bn/timestamps.tmp.txt"
scenes=$(wc -l < "./$bn/timestamps.tmp.txt")
echo "Found $scenes scenes"
sleep 1
while IFS= read -r line; do
echo "---------------------------------------------------------------------------"
echo "SCENE START: $count/$scenes ($start,$line)"
ffmpeg -i "$in" -ss "$start" -to "$line" -nostdin -y -vcodec libx264 -acodec aac -g 120 -s 1280x720 -r 30 "./$bn/$bn.($count of $scenes).mp4"
echo "SCENE DONE:$count/$scenes ($start,$line)"
echo "---------------------------------------------------------------------------"
start=$line
count=$(($count+1))
sleep 1
done <"./$bn/timestamps.tmp.txt"
echo "---------------------------------------------------------------------------"
echo "LAST SCENE START:$count/$scenes ($start,end)"
ffmpeg -i "$in" -ss "$start" -nostdin -y -vcodec libx264 -acodec aac -g 120 -s 1280x720 -r 30 "./$bn/$bn.($count of $scenes).mp4"
echo "LAST SCENE DONE:$count/$scenes ($start,end)"
echo "---------------------------------------------------------------------------"
echo "FILE DONE: $bn"
echo "=============================================================================="
Надеюсь, это поможет
Я использовал Scenalyzer Live с большим успехом. Он обнаруживает сцены, но это инструмент с графическим интерфейсом Windows, а не командная строка Linux:
ScLive имеет автоматическое разделение сцены во время захвата - каждая сцена записывается в свой собственный файл .avi в режиме реального времени. Он разделяет сцены на основе времени записи, встроенного в DV-потоки или на основе оптического контента.
Согласно его веб-странице ( http://www.kdenlive.org/users/jbm/preparing-new-kdenlive-release ), Kdenlive обладает этой функциональностью (называемой функцией анализа клипов).