1

У меня есть видео проект, который я пытаюсь скомпилировать. Вот обзор:

  1. У меня много видео, которые представляют собой 5-минутные тренировки - основное видео.
  2. Вступительное видео будет стандартным 5-секундным видео, которое будет иметь название видео и автора. Это будет связано с основным видео.
  3. Трейлинг-видео будет в значительной степени стоковым видео, которое будет присоединено к основному видео и будет иметь все права и т.д.
  4. Intro Vid будет плавно переходить в основной видеофильм, а когда вы доберетесь до конца основного видео, он будет плавно переходить в видео Trailing.
  5. Продукт представляет собой новое видео с видео вступления, основного и трейлера в одном!

Концепция действительно так проста. На самом деле я нашел пример человека, который решил это и делает именно то, что я хочу.

Это решение представляет собой скрипт Bash, который принимает файл конфигурации с заголовком, автором и т.д., Генерирует вступление, окончание и создает получившееся видео с их объединением.

Я использую Ubuntu 12.04 Server. Я пытался взять это в качестве образца и просто запустить его без удачи из-за ошибок несовместимости. Я даже попытался преобразовать это, используя .MP4 или .MKV . Я сталкиваюсь с ошибкой после ошибки или несовместимости. Я зашел так далеко, что изменил двоичный файл ffmpeg используя версию от 25 октября 2013 года с http://ffmpeg.gusari.org/static/64bit/, что мне нравится, так как мне не нужно беспокоиться о перестройке двоичного файла. Почти успешно, но снова у меня есть ошибка, которую я не могу решить.

Я знаю, что частью проблемы является тот факт, что производство видео, кодеки, форматы - это совершенно новая область для меня, поэтому я пытаюсь работать через эту новую территорию.

Возможно, у эксперта есть нечто подобное, что я могу использовать в качестве руководства, использующего формат MP4 или h.264. Или воспользуйтесь приведенным выше решением из URL-адреса и настройте его на более свежую версию ffmpeg.

Я включу скрипт и его файл параметров и вывод (сокращенно из-за ограничений) ниже. В основном, как скрипт сейчас стоит, при запуске я получаю ошибку [matroska,webm @ 0x27bbee0] Read error . Эта ошибка возвращается из подпрограммы 'reasembleVideo' из первой команды ffmpeg.

Ниже приведен файл параметров:

#!/bin/bash
INPUTFILE="ssh_main.mp4"
LOGO="logo.png"
LOGOLENGTH="1"
SPEAKER="Jason"
TITLE="Basic SSH Video"
DATE="October 28, 2013"
SCENESTART="00:00:01"
SCENEDURATION="00:00:09"
OUTPUTFILE="ssh_basic_1"
}

Ниже приведен скрипт, который я запускаю. Используемый ${OUTPUTFILE} - это небольшое 2-минутное видео, которое я создаю в screen-o-matic в формате MP4.

Скрипт на PasteBin (слишком длинный для сообщения суперпользователя )

2 ответа2

1

В производственной среде, когда нужно присоединить много видео, для автоматизации процесса вы можете разбить его на четыре компонента. Допустим, у вас есть 100 основных обучающих видео для начала. Они называются main001.mov, main002.mov и так далее до main100.mov.

  • Создайте свои 100 титульных карточек в формате png или в другом формате с помощью imagemagick/graphicsmagick/gimp/photoshop/ любой другой.
  • Преобразуйте их в файлы mov в ffmpeg. Я показываю, используя подготовленный стереофонический звуковой файл, который молчит, вместо ввода с нулевого устройства, но это тоже было бы хорошо. Это создает 5-секундный заголовок с постепенным и постепенным исчезновением:
#!/bin/bash  

for i in *.png;  
do  
ffmpeg -y -loop 1 -f image2 -i $i -i silence.wav -t 00:00:05 -s 1920x1080 -aspect 16:9 -acodec pcm_s24le -b:a 128k -vcodec qtrle -b:v 1024k -filter_complex 'fade=in:0:10, fade=out:110:10' -f mov ${i%%.png}.mov

done

Это создает (100) заголовков MOV из предоставленных файлов PNG.

  • Создайте свою конечную карту как png и конвертируйте в mov как раньше, только теперь вы можете сказать:
ffmpeg -y -loop 1 -f image2 -i endcard.png -i silence.wav -t 00:00:05 -s 1920x1080 -aspect 16:9 -acodec pcm_s24le -b:a 128k -vcodec qtrle -b:v 1024k -filter_complex 'fade=in:0:10, fade=out:110:10' -f mov endcard.mov
  • Объедините три набора файлов, первые два набора содержат по 100 файлов каждый, заголовок и основной файл, а третий содержит только один общий конечный файл. Для этого вы помещаете имена файлов наборов в три массива и перебираете индексы массива, чтобы соединить их следующим образом:
#!/bin/bash  

# define the movie array  

movie=("main001.mov" "main002.mov" .....and so on till ... "main100.mov")  

#define titles array  

title=("title001.mov" "title002.mov" .....and so on till ... "title100.mov")  

#define end card array  

endcard=("endcard.mov")  

# Use for loop  
# get total subscripts in an array  

total=${#movie[*]}  

for (( i=0; i<=$(( $total -1 )); i++ ))  
do  
ffmpeg -i ${title[i]} -i ${movie[i]} -i ${endcard[0]} -y -filter_complex '[0:0] setsar=1/1[sarfix];[sarfix] [1:0]  [2:0] concat=n=3:v=1:a=0 [v]' -map '[v]' -pass 1 -strict -2 -an -vcodec libx264 -pix_fmt yuv420p -aspect 16:9 -threads 4 -b:v 1024k -flags +loop -cmp chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 1 -trellis 0 -refs 1 -bf 3 -b_strategy 2 -coder 1 -me_range 16 -g 250 -keyint_min 75 -sc_threshold 40 -i_qfactor 0.71 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 ${movie[i]%%.mov}.mp4

ffmpeg -i ${title[i]} -i ${movie[i]} -i ${endcard[0]} -y -filter_complex '[0:0] setsar=1/1[sarfix];[sarfix] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1[v] [a]' -map '[v]' -map '[a]' -strict -2 -acodec aac -b:a 128k -pass 2 -vcodec libx264 -pix_fmt yuv420p -aspect 16:9 -threads 4 -b:v 1024k -flags +loop -cmp chroma -partitions +parti4x4+partp8x8+partb8x8 -mixed-refs 1 -subq 6 -trellis 1 -refs 5 -bf 3 -b_strategy 2 -coder 1 -me_range 16 -g 250 -keyint_min 75 -sc_threshold 40 -i_qfactor 0.71 -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 ${movie[i]%%.mov}.mp4

done

Пропуск 1 не учитывает звук. Индекс массива endcard является статическим в 0, так как есть только один. Конечно, вы можете напрямую передать имя файла вместо использования массива. Sarfix МОЖЕТ потребоваться, если заглавный фильм или даже фильм-открытка вызывают проблемы. Я не показал опцию sarfix для фильма с конечной картой - для этого потребуется setar = 1/1 [sarfix]; [sarfix] после отображения [2:0]. Обратите внимание, что размеры и битрейт могут не подходить для вас.

Таким образом, вы можете автоматизировать объединение большого количества основных файлов с заголовками и конечными карточками.

0

У вас есть 2 $ {OUTPUTFILE} .mkv? Один для основного ввода и один для окончательного вывода? Замените последний явно на что-то вроде $ {FINALOUTPUT} .mkv. Вы используете протокол concat в формате mkv. Вы должны использовать демультиплексор concat или изменить все промежуточные файлы на форматы mpeg или .ts. Также:

Ставьте ставку - r 29,97 после -i "$ {OUTPUTFILE} -frames"/frame%d.png.
Так что вместо:
./ffmpeg -threads 4 -r 29.97 -f image2 -i "${OUTPUTFILE}-frames"/frame%d.png \ -i "${OUTPUTFILE}.mkv" -c:a copy \ -map 0:0 -map 1:0 -f MP4 -y "${OUTPUTFILE}.mkv"

Использование:
./ffmpeg -threads 4 -f image2 -i "${OUTPUTFILE}-frames"/frame%d.png -r 29.97 \ -i "${OUTPUTFILE}.mkv" -c:a copy \ -map 0:0 -map 1:0 -f MP4 -y "${OUTPUTFILE}.mkv"

На этапе объединения попробуйте без оценки:
./ffmpeg -threads 4 \ -i concat:"${OUTPUTFILE}-intro.mkv"\|"${OUTPUTFILE}.mkv"\|"${OUTPUTFILE}-exit.mkv" \ -y "${FINALOUTPUT}.mkv"

Если это не работает, вы должны использовать другие параметры concat, такие как concate demuxer:
ffmpeg -f concat -i mylist.txt -c copy output
Где mylist.txt содержит список трех сгенерированных файлов.
Смотрите это.

Существуют также другие проблемы, когда один поток по умолчанию использует yuv444p, а другой - явно yuv420p. Это должно быть явно указано -pix_fmt yuv420p:
ffmpeg -loop 1 -i "${OUTPUTFILE}-intro.png" -q:v 1 -r 29.97 -t ${LOGOLENGTH} -y -f MP4 "${OUTPUTFILE}-logo1.mkv"
а также следующий этап:
ffmpeg -i "${OUTPUTFILE}-logo1.mkv" -i "silence.mkv" \ -c:v copy -c:a copy -map 0:0 -map 1:0 -threads 4 \ -y -f MP4 "${OUTPUTFILE}-intro.mkv"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .