Я хочу разделить большое видео в формате avi на два последовательных видео меньшего размера. Я использую ffmpeg.
Один из способов - запустить ffmpeg два раза:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Но согласно man-странице ffmpeg, я могу создать более одного файла вывода из одного файла ввода, используя всего одну строку:
ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:00:00 -t 00:30:00 output1.avi \
-vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi
Мой вопрос: экономит ли более поздний подход время вычислений и память?
htop
), и не сказать нам, каков ответ?-ss
качестве параметра ввода во втором разбиении может быть неточным, поэтому вы не можете получить чистое разбиение. ИМО вернее пример OP.Ответы:
Вики ffmpeg ссылается на эту страницу в разделе «Как эффективно разделить видео». Я не уверен, что эта страница отвечает на этот вопрос, поэтому я сделал, как предложил @AlcubierreDrive…
Какие выходы ...
Я протестировал файл SD и HD после нескольких прогонов и небольшой математики.
Файл SD = 1,35 ГБ транспортного потока DVB
Файл HD = 3,14 ГБ транспортного потока DVB
Вывод
Единственная команда лучше, если вы работаете с HD, это согласуется с комментариями руководства по использованию -ss после входного файла для выполнения «медленного поиска». Файлы SD имеют незначительную разницу.
Версия с двумя командами должна быть быстрее, добавив еще одну -ss перед входным файлом для «быстрого поиска», за которым следует более точный медленный поиск.
источник
-q:v 0
.Вот полезный скрипт, который поможет вам автоматически разделить: Скрипт для разделения видео с помощью ffmpeg
источник
По моему опыту, не используйте ffmpeg для разделения / соединения. MP4Box быстрее и легче, чем ffmpeg. Пожалуйста, попробуйте. Например, если вы хотите разделить файл MP4 размером 1400 МБ на две части по 700 МБ, вы можете использовать следующую команду:
MP4Box -splits 716800 input.mp4
например, для объединения двух файлов, которые вы можете использовать:Или, если вам нужно разделить по времени, используйте
-splitx StartTime:EndTime
:MP4Box -add input.mp4 -splitx 0:15 -new split.mp4
источник
EndTime
чем-t
.http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg также может быть вам полезен. Также в ffmpeg есть мультиплексор сегментов, который может работать.
В любом случае, я предполагаю, что объединение их в одну команду сэкономит время.
источник
Между этими двумя приведенными вами примерами нет большой разницы. В первом примере видео обрезается последовательно, в 2 этапа, а во втором примере - одновременно (с использованием потоков). Особого разгона не будет. Вы можете узнать больше о создании нескольких выходов с помощью FFmpeg
Более того, вы можете использовать (в недавнем FFmpeg) мультиплексор сегментера потока, который может:
источник
Вот простой файл bat Windows для разделения входящего файла на 50 частей. Каждая часть длится 1 минуту. Простите за такой тупой сценарий. Я надеюсь, что лучше иметь тупой скрипт Windows, чем не иметь его вообще. Возможно, это кому-то поможет. (На основе "bat-файла для цикла" с этого сайта.)
источник
ffmpeg
команды), переписанный в виде цикла. Это не отвечает на вопрос, будет ли этот подход или отдельная команда «сэкономить время вычислений и память».Не тестировал ist, но выглядит многообещающе:
Базовый сегментатор потока
Очевидно, что AVI разбивается на сегменты одинакового размера, что означает, что эти фрагменты не теряют качества, не увеличивают объем памяти и не должны быть пересчитаны.
Он также использует копию кодека - означает ли это, что он может обрабатывать очень большие потоки? Поскольку это моя проблема, я хочу разбить свой avi, чтобы я мог использовать фильтр, чтобы избавиться от искажения. Но целый avi работает часами.
источник
Вот идеальный способ разделить видео. Я делал это раньше, и у меня это хорошо работает.
ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4
(Для cmd).shell_exec('ffmpeg -i C:\xampp\htdocs\videoCutting\movie.mp4 -ss 00:00:00 -t 00:00:05 -async 1 C:\xampp\htdocs\videoCutting\SampleVideoNew.mp4')
(для php).Пожалуйста, следуйте этому, и я уверен, что он будет работать идеально.
источник
-i
за которым следует-ss
и-t
. Однако вопрос заключается в том, как эффективно извлечь несколько сегментов из одного входного файла, в то время как вы извлекаете только один сегмент. Я не понимаю, как это отвечает на вопрос.один простой способ - использовать опцию обрезки с api на основе url-адресов publitio .
как только вы загрузите видео, просто установите начальное и конечное смещения в url (so_2, eo_2) следующим образом:
это мгновенно создаст новые видео, начиная со 2-й секунды и продолжительностью 2 секунды. вы можете разделить видео так, как вам нравится.
источник
ffmpeg
. Если у вас нет действительно очень быстрого интернет-соединения, я думаю, что необходимость загрузить все видео в облачную службу, а затем загрузить результаты, значительно увеличит время обработки. Тем не менее , это еще не дает ответа на вопрос о том, какой подход сffmpeg
более эффективным.