четверг, 28 марта 2013 г.

Как вырезать кусок из видео

Программ, которыми можно вырезать из видео нужный кусок на самом деле вагон и маленькая тележка, но одни платные, другие открывают только видеофайлы определенного типа (например, только avi) или только использующие определенные кодеки, к третьей привыкнешь под windows, а под linux её не окажется. Чтоб не морочить себе голову всякой ерундой, проще всего запомнить одно универсальное бесплатное решение под windows, mac и linux - командную строку FFMPEG.

В простейшем случае она будет выглядеть так (вырезать из input.mp4 начиная с момента в 1 мин 9 сек кусок в 10 мин и положить в output.mp4 без перекодировки):
ffmpeg -i input.mp4 -ss 00:01:09 -t 00:10:00 -c copy output.mp4

Но здесь есть одна засада - кодеки, сжимающие видео пишут один полный видео кадр (опорный), а потом несколько кадров с информацией только об изменившихся кусочках опорного кадра, потом снова опорный кадр полностью и т.д. Вырезая кусок с опцией -c copy ffmpeg может (и скорее всего так и сделает) начать видео файл output.mp4 с нескольких неполных кусков кадров без опорного кадра перед ними. При просмотре это будет выглядеть как секунда мусора в начале видео, проигрыватели видео ее без проблем пережевывают.
Собственно засада будет если попытаться выложить вырезанный кусок на какой-либо видеохостинг - после закачки будет выдано сообщение об ошибке при обработке видеофайла с адекватностью обратно-пропорциональной пофигизму программиста, который писал эту обработку - от вполне понятного на youtube до полностью дебильного на facebook-е. Сам ffmpeg, кстати, такие файлы тоже обычно потом пережёвывать не может - ругается на неправильные пикселы в первом видеокадре.

Полечить этот неприятный момент можно включив одновременное пережатие вырезаемого куска (тип кодеков в данном случае задается расширением выходного файла - mp4):
ffmpeg -i input.mp4 -ss 00:01:09 -t 00:10:00 output.mp4

а лучше так:
ffmpeg -i input.mp4 -ss 00:01:09 -t 00:10:00 -b:v 3000K -acodec libmp3lame output.mp4

поднятие битрейта видео (-b:v 3000K) по сравнению с используемым по умолчанию позволяет получить более приличное качество (конечно если у исходного видео битрейт был больше 3000K), а с кодеком звука mp3 почему-то никогда не возникает дефекта постепенной рассинхронизации видео и аудио, который нет-нет да и вылезает при таких манипуляциях и использовании других аудиокодеков.

Если надо одновременно поменять разрешение вырезаемого куска, добавляем опцию -s:
ffmpeg -i input.mp4 -ss 00:01:09 -t 00:10:00 -s 1280x720 -b:v 3000K -acodec libmp3lame output.mp4

Если исходное видео содержит несколько аудио дорожек и/или субтитры, нужно будет указать номера всех дорожек, которые нам нужны в выходном файле:
ffmpeg -i input.mkv -ss 00:01:09 -t 00:10:00 -map 0:0 -map 0:1 -map 0:2 -map 0:3 -s 1280x720 \
-b:v 3000K -acodec libmp3lame -scodec copy output.mkv

-map задает перечень и порядок дорожек, которые нужны в выходном файле, а -scodec copy копирование субтитров без перекодировки.

Комментариев нет:

Отправить комментарий