ffmpeg об'єднайте два файли mp4 з ffmpeg у командному рядку


29

Я можу успішно приєднатися до декількох файлів за допомогою наступної команди:

ffmpeg -f concat -i input.txt -codec copy output.mp4

Єдина проблема з цією командою полягає в тому, що вам потрібно прочитати файлові шляхи з текстового файлу, що називається input.txt, із наступним вмістом:

file 'C:\Users\fabio\Downloads\Super\Sharks\01.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\02.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\03.mp4'

Чи є спосіб досягти тієї самої мети без того, щоб читати файли із файлу? Я спробував наступне без удачі:

ffmpeg -f concat -i file "C:\a\b\01.mp4" file "C:\a\b\02.mp4" -codec copy output.mp4
ffmpeg -f concat -i "C:\a\b\01.mp4" "C:\a\b\02.mp4" -codec copy output.mp4

Чи потрібно використовувати іншу команду?


Відповіді:


37

Оновлення 2019 року:

Як зазначалося в коментарях, Stack Overflow має чудовий опис доступних варіантів конкатенації, а також обговорення того, який метод використовувати, залежно від типів файлів, які ви використовуєте:

Як об'єднати два файли MP4 за допомогою FFmpeg?

Оригінальний відповідь 2016 року:

Ви повинні мати можливість використовувати метод протоколу concat для комбінування файлів:

ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4

Крім того, посібник з FFmpeg обговорює метод спеціально для файлів MP4, щоб без втрат об'єднати їх, але вимагає створення тимчасових файлів (або іменованих труб):

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

1
Перша команда працювала для мене, як вершкове масло. Для укладання моїх файлів 6 mp4 у вихідний файл знадобилося 2–3 секунди (прибл. 239 Мб).
Сачин

22
Перша команда не працювала для мене. Він просто скопіював перший файл.
Луїс А. Флорит

3
Це не працює, він просто скопіював перший файл у output.mp4.
crmpicco

2
Зв'язок рівня файлів не працює для MP4, тому протокол concat не рекомендується для цього формату і, як правило, не працює.
llogan

1
@brasofilo Дякую за посилання. Це давно назріло, але я оновив відповідь, щоб вказати людям у цьому напрямку.
Карсон Дарлінг

5

Ви можете замінити файл на список, вивівши список stdoutта прочитавши список із stdinffmpeg:

(echo file 'a.mp4' & echo file 'b.mp4') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "result.mp4"

Використовуючи ffmpeg версії 2.4.3-tessus на Mac OS 10.12.6, це просто видає помилку: "Нерозпізнаний параметр" Protocol_whitelist "". Без параметра Protocol_whitelist, здається, це просто зробити копію другого файлу MP4.
Джеймс

2

Ні, схоже, немає можливості використовувати ffmpeg concat demuxer в одному командному рядку без якогось злому. Потрібно створити вхідний текстовий файл із переліком файлів. Я думав, що це дивно сам, можливо, хтось додасть це до FFMpeg пізніше.

Прийнята відповідь на це запитання використовує протокол concat, а не concat demuxer, про що задається ОП.


1
Насправді є. stdin.
Qwertiy

протокол concat не слід використовувати з MP4 або будь-яким іншим форматом, де потрібен загальний заголовок.
логіан

1

Ви все ще можете це зробити за сценарієм, не змінюючи команди. Щось на зразок:

echo "file fname1" >$$.tmp    #single redirect creates or truncates file
echo "file fname2" >>$$.tmp   # double redirect appends
echo "file fname3" >>$$.tmp   # do as many as you want.

ffmpeg -f concat -i $$.tmp -codec copy output.mp4

rm $$.tmp  # just to clean up the temp file. 
           # For debugging, I usually leave this out.

$$ розширюється на під оболонки, що виконує команду, тому ім'я файлу буде різним щоразу, коли ви запускаєте його. щоб ви могли використовувати $$. txt, якщо хочете. Або щось інше ...

Також ви можете використовувати тут файли, щоб додати до файлу купу даних:

cat <<EOF >$$.tmp
file fname1
file fname2
file fname3
EOF

bash Змінна підміна працює, тому ви можете програмно визначати вміст файлу, його не потрібно виправляти. Я весь час вставляв такі речі для петель. Нарешті, переспрямування працює так само, як вище, тому> $$. Tmp скорочує, а потім пише, додається >> $$. Tmp.


2
Питання задає питання: "Чи є спосіб досягти тієї ж мети, не зчитуючи файли з файлу?" Все, що ви зробили, - це забезпечити спосіб запису файлових файлів у файл (до читання файлових шляхів з файлу). Це не дає відповіді на запитання.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.