LINUX.ORG.RU

Ffmpeg, нарезка

 


0

1

Всем привет.

Мне нравится ffmpeg. Я довольно часто его использую для не слишком сложных манипуляций с видео, но одна проблема меня убивает. Такой функциональный пакет, а нарезать видео можно только через опу. Написал потому, что может быть я о чем то не знаю и мне подскажут.

Имеется видяшечка, задача вырезать кусок с такого:то:времени по такое:то

ffmpeg -t /path/to/file.avi -ss 00:01:00 -t 00:20:00 -vcodec copy -acodec copy /path/to/output.avi

Так вот как вырезать видео не вычисляя сколько оно продолжается, а тупо ввести два timestamp? Можно конечно и вычислять секунды и минуты, но блин почему не сделать такого ключа - указал начало, указал окончание нарезки и все?

Я обычно так делал, чтобы не вычислять: -ss $start_time -t $(($end_time - $start-time))
В переменных длительность в секундах, которые я брал из консоли при воспроизведении с помощью mplayer.

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

Спасибо, значит таки встроенными средствами ffmpeg это невозможно. По крайней мере на данный момент.

partyzan ★★★ ()

но блин почему не сделать такого ключа

Потому что дублирование, переусложнение, типичный антипаттерн.

anonymous ()
Ответ на: комментарий от anonymous

То есть считать сколько секунд пройдет с 00:27:13 до 00:54:42 это не переусложнение? А добавить пару ключей в сотню существующих (см.man ffmpeg) это значит переусложнение?

partyzan ★★★ ()
Ответ на: комментарий от partyzan

Нет, для того арифметика в командной оболочке и есть. Да, сотня существующих ключей ffmpeg делает то, что другие утилиты не могут (по большей части), для того он и был написан.

anonymous ()
Ответ на: комментарий от partyzan

А что раскукарекался тогда? Если не так часто этим занимаешься, то посчитаешь секунды, не развалишься, лол.

fragmentor ()

Я для этого пейсал обёртку строчек на двадцать в баше.

#!/bin/bash
i=${1:0:2}; i=${i#0}
j=${1:3:2}; j=${j#0}
k=${1:6:2}; k=${k#0}
start=$((i*3600 + j*60 + k))
echo $start
i=${2:0:2}; i=${i#0}
j=${2:3:2}; j=${j#0}
k=${2:6:2}; k=${k#0}
end=$((i*3600 + j*60 + k))
echo $end
time=$((end - start))
hour=$((time / 3600))
min=$((time / 60 - hour*60))
sec=$((time - hour*3600 - min*60))
ss=$1
t=`printf %02d:%02d:%02d $hour $min $sec`
shift; shift
exec ffmpeg -ss $ss -t $t "$@"

За точность воспроизведения не ручаюсь.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.