Разбираемся · Создание онлайн-курсов

FFmpeg: как объединить готовые фрагменты видеоурока в один файл

Подготовим список заставки, демонстрации и завершения, проверим совместимость потоков и соберём отдельный результат. Разберём, когда копирование без перекодирования нужно остановить.

В этом материале

Отделите последовательную сборку от монтажа

Представим, что автор уже подготовил три законченных фрагмента урока: intro.mp4, demo.mp4 и outro.mp4. Их требуется показать друг за другом без переходов, наложений и изменения изображения. В нашем условном плане длительности составляют 8, 44 и 8 секунд — вместе одну минуту.

Для такой операции в FFmpeg есть concat demuxer: он читает список файлов и последовательно передаёт их потоки. Требования и устройство списка описаны в официальной документации concat. Наличие одинакового расширения MP4 ещё не подтверждает совместимость содержимого.

Если между записями потерян шаг объяснения, команда его не восстановит. Сначала пройдите содержательную проверку монтажа учебного видео. Для одновременного показа камеры и экрана, титров или исправления оговорок понадобится другой процесс. Здесь рассматривается именно последовательная сборка уже готовых частей через терминал.

Проверьте состав и параметры каждого исходника

Работайте с копиями в отдельной папке. Для примера предполагается, что FFmpeg и ffprobe уже установлены и доступны по имени команды. Откройте терминал в этой папке. Не вводите команды из статьи в строку поиска браузера или в редактор текста: это инструкции для командной строки.

Посмотрите сведения первого файла командой ffprobe -v error -show_streams -show_format intro.mp4. Повторите её для demo.mp4 и outro.mp4. В документации ffprobe описаны сведения о контейнере и отдельных потоках. Важно сопоставить не только название видеокодека, но и число, тип и порядок потоков, временную базу, разрешение, параметры изображения и звука.

Для нашего маршрута каждый файл должен содержать одно совместимое видео и одну совместимую аудиодорожку. Если заставка вообще без аудиопотока, а остальные части со звуком, исходный набор уже не соответствует условию. Одинаковые названия кодеков тоже не гарантируют совпадения всех параметров. При различиях подготовьте единый экспорт через редактор и снова проверьте файлы.

Составьте список в требуемом порядке

Создайте обычный текстовый файл list.txt рядом с тремя роликами. В нём должны быть три строки. Первая: file 'intro.mp4'. Вторая: file 'demo.mp4'. Третья: file 'outro.mp4'. Каждую директиву file разместите на отдельной строке, без точек в конце предложения, нумерации или маркеров списка.

Для этого примера используйте простые латинские имена без пробелов и сохранение без BOM. Не делайте документ Word с расширением TXT: нужен именно простой текст. Одинарные кавычки вокруг имени должны быть прямыми, как в приведённых строках. Типографские кавычки из оформленного документа имеют другое назначение.

Последовательность задаёт list.txt, а не сортировка файлов в проводнике. Прочитайте его сверху вниз и сверьте роли фрагментов. Пути в нашем примере относительные и указывают на соседние файлы; не добавляйте отключение проверки безопасных путей ради исправления опечатки. Если файл не найден, сначала проверьте имя, расширение и расположение списка.

Запустите копирование в новый результат

Выполните одной строкой: ffmpeg -n -f concat -i list.txt -map 0:v:0 -map 0:a:0 -c copy lesson.mp4. Здесь входом служит список; выбираются первый видеопоток и первый аудиопоток. Параметр -n запрещает перезаписывать уже существующий выходной файл. Для следующей попытки задайте новое имя и сохраните предыдущую версию для сравнения.

Режим -c copy переносит закодированные потоки без обычного цикла декодирования и повторного кодирования. Его границы описаны в разделе FFmpeg о streamcopy. Он не уменьшает разрешение, не выравнивает громкость и не превращает несовместимые исходники в совместимые автоматически.

Дождитесь завершения и прочитайте сообщения программы. Проверяйте, что создан именно новый lesson.mp4, а не остался файл прежней попытки. Само появление приглашения терминала не доказывает успешной операции. Особенно внимательно относитесь к сообщениям о временных метках и отсутствующих потоках.

Проверьте границы изображения и звука

Откройте результат и просмотрите его целиком. Для минутного плана отдельные контрольные места — начало, переход около восьмой секунды, переход около пятьдесят второй и завершение. Длительности контейнера и потоков могут различаться; поэтому расчёт 8 + 44 + 8 является ориентиром для проверки состава, а не гарантией точности готовой шкалы до кадра.

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

В редакционной технической пробе на трёх искусственных H.264/AAC-фрагментах команда создала декодируемый файл, но сообщила Non-monotonic DTS для аудио. Такая проба показывает границу проверки: успешное создание и декодирование не означают готовность урока. При подобных предупреждениях остановите публикацию и подготовьте вариант с едиными параметрами и перекодированием в редакторе, затем проверьте его заново.

Сохраните воспроизводимый комплект сборки

Оставьте рядом список, исходные части, журнал сообщения FFmpeg и проверенный результат с датой версии. Запишите, какие потоки включены и где проверены переходы. Если позднее заменится только демонстрация, сначала сравните параметры нового фрагмента с остальными; прежняя успешная сборка не подтверждает совместимость обновлённого файла.

Для задачи разделения длинной записи на самостоятельные уроки предусмотрен другой маршрут — нарезка в LosslessCut. Не путайте сохранение отдельных отрезков с объединением готовых файлов: у них разные карты проверки и ожидаемое число результатов.

В Umhub загружайте проверенный учебный ролик и повторяйте контроль в ученическом плеере. Выполнение FFmpeg внутри платформы для этого сценария не предполагается. Итог работы — не просто склеенный файл, а понятная последовательность с сохранённым звуком и проверенными стыками.

Источники

  1. официальной документации concat ↗
  2. документации ffprobe ↗
  3. разделе FFmpeg о streamcopy ↗
Создать аккаунт и собирать свою библиотеку →
От знаний — к своему курсу

Создайте свой курс в Umhub

Примените то, что узнали: соберите программу, добавьте материалы и пригласите учеников.

Создать курс