В сообществе разработчиков программного обеспечения с открытым исходным кодом или в активном сообществе разработчиков часто возникает необходимость публиковать большие видеофрагменты в Интернете. (Видео для встреч, лагеря, технические разговоры ...) Поскольку я являюсь разработчиком, а не видеографом, у меня нет желания раскошелиться на дополнительную премию в премиум-аккаунте Vimeo. Как мне тогда взять техническое видео MPEG 12,5 ГБ (1:20:00) и разделить его на сегменты 00:10:00 для удобной загрузки на сайты обмена видео?
ffmpeg
video-editing
Габриель
источник
источник
Ответы:
Свернуть это в скрипт, чтобы сделать это в цикле, не составит труда.
Имейте в виду, что если вы попытаетесь рассчитать количество итераций на основе длительности, полученной при
ffprobe
вызове, то это будет оценено по средней скорости передачи в начале клипа и размеру файла клипа, если вы не укажете-count_frames
аргумент, что значительно замедляет его работу ,Еще одна вещь, о которой следует знать, это то, что положение
-ss
опции в командной строке имеет значение . Где у меня это сейчас медленно, но точно. Первая версия этого ответа дала быструю, но неточную альтернативу. В связанной статье также описывается в основном быстрая, но все же точная альтернатива, за которую вы платите с небольшой сложностью.Несмотря на это, я не думаю, что вы действительно хотите вырезать ровно 10 минут для каждого клипа. Это поместит сокращения прямо в середину предложений, даже слов. Я думаю, что вы должны использовать видеоредактор или проигрыватель, чтобы найти естественные точки среза, не дойдя до 10 минут.
Предполагая, что ваш файл имеет формат, который YouTube может принять напрямую, вам не нужно перекодировать, чтобы получить сегменты. Просто передайте естественное смещение точки обрезания
ffmpeg
, сказав ему пропустить закодированный A / V без изменений, используя кодек «copy»:-c copy
Аргумент говорит это , чтобы скопировать все входные потоки (аудио, видео, и потенциально другие, такие как субтитры) на выход как есть. Для простых A / V программ это эквивалентно более многословным флагам-c:v copy -c:a copy
или флагам старого стиля-vcodec copy -acodec copy
. Вы бы использовали более многословный стиль, когда хотите скопировать только один из потоков, но перекодировать другой. Например, много лет назад была распространена практика с файлами QuickTime сжимать видео с видео H.264, но оставлять аудио как несжатый PCM ; если вы наткнулись на такой файл сегодня, вы можете его модернизировать,-c:v copy -c:a aac
чтобы обработать только аудиопоток, оставив видео нетронутымНачальная точка для каждой команды, указанной выше после первой, - это начальная точка предыдущей команды плюс продолжительность предыдущей команды.
источник
ffmpeg
необходимая для поддержания синхронизации между аудио- и видеопотоками, может отсутствовать в исходном файле. Если это происходит с вами, есть более сложные методы разделения, которые позволяют избежать проблемы.Вот решение в одну строку :
Обратите внимание, что это не дает точного разделения, но должно соответствовать вашим потребностям. Вместо этого он будет вырезать первый кадр после времени, указанного после
segment_time
, в приведенном выше коде он будет после 20-минутной отметки.Если вы обнаружите, что воспроизводится только первый блок, попробуйте добавить,
-reset_timestamps 1
как указано в комментариях.источник
-reset_timestamps 1
Столкнулся с той же проблемой ранее и собрал простой скрипт на Python, чтобы сделать именно это (используя FFMpeg). Доступно здесь: https://github.com/c0decracker/video-splitter и вставлено ниже:
источник
Если вы хотите создать действительно одинаковые чанки, необходимо заставить ffmpeg создавать i-кадр в первом фрейме каждого чанка, чтобы вы могли использовать эту команду для создания 0,5-секундного чанка.
источник
Alternate более читаемым способом будет
Вот источник и список часто используемых команд FFmpeg.
источник
Обратите внимание на точную пунктуацию альтернативного формата
-ss mm:ss.xxx
. Я боролся в течение нескольких часов, пытаясь использовать интуитивное, но неправильное,mm:ss:xx
но безрезультатно.Ссылки здесь и здесь .
источник
источник
Просто используйте то, что встроено в ffmpeg, чтобы сделать именно это.
Это разделит его на примерно 2-х секундные фрагменты, разделит на соответствующие ключевые кадры и выведет в файлы cam_out_h2640001.mp4, cam_out_h2640002.mp4 и т. Д.
источник