Вирізати частину з відеофайлу від початкової позиції до кінцевої позиції за допомогою FFmpeg [дублювати]


129

На це запитання вже є відповідь:

У мене є відеофайл 30 хвилин, але я хочу витягти відео з 00:09:23 до 00:25:33.

Я можу визначити стартову позицію -ss, але я не знайшов для кінцевої позиції. Будь-яка допомога, будь ласка?

Відповіді:


224

Встановіть ffmpeg

Переконайтеся, що ви завантажити останню версію ffmpegі не використовуйте той, який постачається з вашим дистрибутивом (наприклад, Ubuntu). Упаковані версії з різних дистрибутивів часто застаріли і не ведуть себе, як очікувалося.

Or скомпілюйте його самостійно .

Як вирізати відео, без повторного кодування

Використовуйте це, щоб вирізати відео з [start] для [duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Тут параметри означають наступне:

  • -ss вказує час початку, наприклад, 00:01:23.000 або 83 (у секундах)
  • -t визначає тривалість кліпу (того ж формату).
  • Останні ffmpeg також має прапор, щоб забезпечити час закінчення з -to.
  • -c copy копіює перший потік бітів відео, аудіо та субтитрів з вхідного файлу у вихідний файл без повторного кодування. Це не завдасть шкоди якості та зробить команду запущеною протягом декількох секунд.

Зверніть увагу, що при старих версіях ffmpeg ця команда може бути неточної при копіюванні бітових потоків.

Як вирізати відео, без повторного кодування - точний метод

Якщо ви маєте стару версію ffmpeg і бажаєте точність кадру, використовуйте цю заміну:

ffmpeg -i in.mp4 -ss [start] -t [duration] -c copy out.mp4

Однак є один недолік. Відео потрібно декодувати, поки не досягне позиції, яку мається на увазі -ssі тільки після цього починається копіювання потоку бітів. Це може зайняти багато часу, особливо для дуже довгих відео.

Як вирізати відео, з повторним кодуванням

Якщо ви залишите -c copy опція, ffmpeg автоматично перекодуватиме вихідне відео та аудіо відповідно до вибраного формату. Для відео та аудіо високої якості читайте Посібник з кодування x264 і Керівництво з кодування AAC відповідно.

Наприклад:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

Як пояснюється Шукаю з FFmpeg ): При використанні -ss раніше -i на FFmpeg 2.1 і новіші, пошук є точним для кадру при повторному кодуванні відео (тобто, не використовуючи -c copy ). Таким чином, вам не доведеться турбуватися про те, що ви робите -ss після -i для швидкості.


Перетворення кінцевих точок на тривалість

Якщо потрібно використовувати стару версію ffmpeg і не може використовувати -to Ви можете створити список редагування точок входу та виходу і перетворити їх у точки з тривалістю. Для цього можна скористатися цей сценарій Ruby Я написав, який розраховує різницю:

require "Time"
def time_diff(time1_str, time2_str)
  t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
  (t - t.gmt_offset).strftime("%H:%M:%S.%L")
end

Наприклад:

time_diff("00:09:23.000", "00:25:33.000")
=> "00:16:10.000" 

1
На Ubuntu 12:10, -c: V і-C: a не працює. Я повинен був використовувати "-acodec копію та -vcodec копію" замість цього.
Samuel Lampa

1
@Samuel Потім ви використовуєте застарілу версію, яка не є навіть реальною FFmpeg, але Libav вилкою. Подивитися: stackoverflow.com/a/9477756/1109017
slhck

Дякуємо за це! якщо ви не вкажете тривалість, чи буде вона закінчуватися?
Jeff

@Jeff Так! (мінімум символів)
slhck

3
@Prateek При копіюванні відеопотоку (замість повторного кодування) можна вирізати лише на ключові кадри . Якщо в секундах 1, 2 і 3 є ключові кадри, але ви хочете вирізати на другий 1.5, то ffmpeg буде чекати до другого 2, перш ніж він може почати різання. Це робить його неточним.
slhck

21

Я думаю, ви можете використовувати наступну команду зараз.

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

Подивіться також ffmpeg Док або цю вікі-сторінку .


5
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFile більш проста версія
nwgat

3
Довелося використовувати ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4 версія (з -copyts ), інакше він неправильно ріжеться (на початку чорний екран). Дякуємо за друге посилання.
Necronomicron

Це здорово, останнє, що я хотів, це обчислення тривалості від кінцевих точок.
Tomasz Gandor

Опція -to відповідає на запитання, яке було фактично задане. Решта відповідей або нахабні, або застарілі.
James Bowery

8

Це дивно, що ніхто не запропонував trim фільтр .

Відкиньте все, окрім другої хвилини введення:

ffmpeg -i INPUT -vf trim=60:120

Тримайте лише першу секунду:

ffmpeg -i INPUT -vf trim=duration=1

Відкиньте все, окрім другого 13 до другого 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

8
Так, добре згадати trim і atrim. Як правило, я використовую їх при фільтрації, але користувачі повинні зазначити це фільтрація вимагає повторного кодування .
llogan

Ти мій герой. Мені дуже потрібен фільтр, який зробив це.
fahadash

3

Їх можна використовувати два методи, які працюють для Windows і Linux.

Існує два способи розділення відеофайлів за допомогою ffmpeg. Перший хороший сам по собі, більше того - він швидше, але іноді створює вихідні файли з певними недоліками. Таким чином, для цих випадків існує другий спосіб розбиття відеофайлів: він значно повільніше, вихідні файли більші, але, здається, вони завжди мають той же рівень якості, що і вхідні.

Спосіб 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

Шлях 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start> - початок частини відео ffmpeg має вирізати. Формат: 00:00:00.0000, що означає години: хвилини: секунди: мілісекунди.

  • <duration> - тривалість частини відео ffmpeg повинна бути вирізана. Такий же формат, що й вище.

Приклади:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg вирізає частину відеофайлу, починаючи з 1 години 19 хвилин 0 секунд. Тривалість відключення відеопослідовності становить 5 хвилин 0 секунд.


Добре, Thnx. Буде перевірити документи і дати йому спробувати завтра.
juGGaKNot

3
-sameq не означає "однакова якість" і видалено з ffmpeg. Використовуйте -codec copy замість цього. Також не забувайте про -to опції.
llogan

Я виправив команди у вашій цитаті, оскільки вони були досить застарілими. Будь ласка, не копіюйте-вставляйте інформацію без належного цитування.
slhck

-1

Ви можете використовувати це

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

Тут потрібно дати тривалість відео. тобто. 00: 25: 33-00: 09: 23


Як я вже згадував у іншій відповіді: За допомогою вашої команди ви повторно кодуєте файл, що абсолютно не потрібно і призводить до зниження якості та збільшення часу обробки.
slhck

-2

Для вирізання відео за допомогою ffmpeg я використовую такий синтаксис:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t використовується для встановлення тривалості в секундах - ви не можете вказати час закінчення, але це має працювати для вас.


Чому ви встановлюєте FFmpeg для повторного кодування файлу? Зверніть увагу на це -sameq зовсім не означає "однакову якість".
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.