Ответ 1
avconv -i concat:file1.mp4\|file2.mp4 -c copy output.mp4
Я не знаю, работает ли с любым типом контейнера (работал у меня с AVI
).
У меня есть несколько кусков в папке.
0001.mp4
0002.mp4
0003.mp4
...
0112.mp4
Я хотел бы объединить их в full.mp4
Я попытался использовать:
avconv -f concat -i <(printf "file '%s'\n" /root/chunk/*.mp4) -y \
-c copy /root/test/full.mp4
Неизвестный формат ввода: 'concat'
avconv -f concat -i <(printf "%s|" /root/chunk/*.mp4) -y \
-c copy /root/test/full.mp4
Неизвестный формат ввода: 'concat'
avconv -i concat:`ls -ltr /root/chunk/*.mp4 | awk 'BEGIN {ORS="|"} { print $9 }'` \
-c:v copy -c:a copy /root/test/full.mp4
В последнем выпуске был выгружен только один входной файл.
Как объединить все куски из папки в полное видео?
Я не хочу использовать ffmpeg или другое. Только Avconv.
avconv -i concat:file1.mp4\|file2.mp4 -c copy output.mp4
Я не знаю, работает ли с любым типом контейнера (работал у меня с AVI
).
mp4
файлы не могут быть просто объединены, как предполагает "принятый" ответ.
Если вы запустите это, и только это, вы получите output.mp4
с содержимым file1.mp4
.
Тем не менее, то, что вы хотите сделать в исходном вопросе, на самом деле может быть выполнено, если вы правильно разделите исходный файл на mpeg-потоки.
Следующие команды разбивают input.mp4
на 3x 60 секундных сегментов в файле [1-3].ts:
avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \
-bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file1.ts
avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \
-bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file2.ts
avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \
-bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file3.ts
Затем вы можете собрать их вместе, как подсказывает другой ответ:
avconv -i concat:"file1.ts|file2.ts|file3.ts" -c copy \
-bsf:a aac_adtstoasc -y full.mp4
Я использовал этот процесс для создания масштабируемого параллельного транскодера, как описано в:
Для mp4 единственным рабочим решением, которое я нашел, было с MP4Box из пакета gpac
#!/bin/bash
filesList=""
for file in $(ls *.mp4|sort -n);do
filesList="$filesList -cat $file"
done
MP4Box $filesList -new merged_files_$(date +%Y%m%d_%H%M%S).mp4
или команда
MP4Box -cat file1.mp4 -cat file2.mp4 -new mergedFile.mp4
с mencoder и avconv я не мог заставить его работать: - (
это работает
avconv -i 1.mp4 1.mpeg
avconv -i 2.mp4 2.mpeg
avconv -i 3.mp4 3.mpeg
cat 1.mpeg 2.mpeg 3.mpeg | avconv -f mpeg -i - -vcodec mpeg4 -strict experimental output.mp4
Выше работает, если у вас есть только avconv - однако ffmpeg добавил функции... цитата:
"Вышеупомянутые шаги avconv делают ненужные дополнительные шаги кодирования с потерями, которые являются медленными и снижают качество вывода. Я бы рекомендовал вместо этого использовать concat demuxer (дополнительная информация) или фильтр concat, но в avconv отсутствуют функции, доступные в ffmpeg из FFmpeg" - @LordNeckbeard
SEE https://trac.ffmpeg.org/wiki/Concatenate
Если вы используете систему, которая поддерживает именованные каналы, вы можете использовать их, чтобы избежать создания промежуточных файлов - это отправляет stderr (куда ffmpeg отправляет все записанные данные) в /dev/null, чтобы не загромождать командную строку:
mkfifo temp1 temp2
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1 2> /dev/null
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2 2> /dev/null
ffmpeg -f mpegts -i "concat:temp1|temp2" -c copy -bsf:a aac_adtstoasc output.mp4
Это работает для меня:
avconv -i "concat:001.mp4|002.mp4|003.mp4" -c copy full.mp4
Просто объединяет все файлы в один mp4, не перекодируя их.
Этот метод будет выполнять только для конкретизации файлов raw *.avi. Но так как многие люди, желающие присоединиться к файлам avi, в конечном итоге просмотрят этот вопрос, я все равно отправлю свой ответ:
cat *.avi > out_tmp.avi
avconv -i out_tmp.avi -c copy output.avi
Еще один раз: работает только для файлов несжатых *.avi.
Я сделал это с avidemux (инструмент gtk). Он доступен как пакет для большинства linux, также для Windows и Mac. Я просто открыл первый файл. Затем я добавил следующие порядки. Наконец, я сохранил конкатенированное видео, используя аудио и видео копию и формат mp4.
Это сработало отлично!
Я использую команду ffmpeg
для этого. Вот пример:
ffmpeg -i concat:/dev/null|file1.ts|file2.ts -c copy -bsf:a aac_adtstoasc -y output.mp4
Взгляните на этот проект github для Распределенное параллельное трассирование видео
Я нашел инструмент под названием Avdshare Video Converter 7, который успешно объединяет мои видео. Он даже перекодирует их практически в любой формат, который я хочу.
Я попробовал каждое решение на этой странице... все они дали мне те же ошибки, с которыми вы, вероятно, столкнулись, если читаете мой ответ. "Протокол не найден" вас расстраивает? Их, может быть, это программа для вас тоже.
Я запускаю его на окнах.
Шаги для объединения двух видео в программе:
Перетащите видео в программу
Нажмите Merge
Выберите "сохранить профиль", который определяет каждый параметр, который вы можете настроить
Нажмите кнопку Сохранить
После того, как я не получил ответ на сообщение об ошибке со всеми этими аналогичными ответами:
~ avconv -i 'concat:' -c copy test.mp4
avconv version 12.3, Copyright (c) 2000-2018 the Libav developers
built on Jan 22 2019 21:47:11 with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
concat:: Protocol not found
Я просмотрел некоторые результаты Google, зашел в систему отслеживания ошибок и нашел их:
Кажется, что он был не только отключен в какой-то момент, но и удален в версии 12, но моя сборка 12.3 на Mac 10.13.6 от Homebrew все еще имеет "concat", перечисленный во входных протоколах, и я также вижу это в документации, таким образом, что 1 выдающийся отчет об ошибке.
Мне повезло с использованием этой команды:
cat *.VOB | avconv -i - -c copy test.mp4