2

Я ищу программу, которая может разбить фильм на части в зависимости от смены сцены. Так что если фильм состоит из лесного пейзажа и рыб в аквариуме, то я хочу получить два фильма: первый о лесе, второй о рыбах. Предпочтительно программа доступна под Linux и имеет интерфейс командной строки

4 ответа4

5

Все, что я мог найти до сих пор:

  • Программа lav2yuv может обнаружить изменения сцены:

    -S list.el
    Output a scene list with scene detection
    

    Чтобы это работало, вам нужно конвертировать ваши видео файлы в MJPEG перед:

    ffmpeg -i source.avi -an -vcodec mjpeg destination.avi 
    

  • Есть заброшенное программное обеспечение, которое называется shotdetect. Это единственная программа для командной строки и с открытым исходным кодом, которую я когда-либо нашел, но я ожидаю, что она не будет работать для большинства видео.
3

Я нашел этот пост несколько дней назад в поисках решения для автоматического разделения клипов. Я закончил тем, что сделал сценарий 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 "=============================================================================="

Надеюсь, это поможет

2

Я использовал Scenalyzer Live с большим успехом. Он обнаруживает сцены, но это инструмент с графическим интерфейсом Windows, а не командная строка Linux:

ScLive имеет автоматическое разделение сцены во время захвата - каждая сцена записывается в свой собственный файл .avi в режиме реального времени. Он разделяет сцены на основе времени записи, встроенного в DV-потоки или на основе оптического контента.

2

Согласно его веб-странице ( http://www.kdenlive.org/users/jbm/preparing-new-kdenlive-release ), Kdenlive обладает этой функциональностью (называемой функцией анализа клипов).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .