Concat два файла mp4 с ffmpeg без потери качества

16

Я хочу объединить 2 видео с помощью ffmpeg. Я использую:

ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts

Но файл mp4, который я получаю, выглядит намного хуже, чем исходный файл.

Вот информация о обоих файлах

   Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
   Metadata:
   major_brand     : isom
   minor_version   : 1
   compatible_brands: isom
   creation_time   : 2013-06-13 15:40:36
   Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
   Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr,   12800 tbn, 50 tbc
   Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s

  Input #0, mpegts, from 'i0.ts':
  Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
  Program 1 
  Metadata:
  service_name    : Service01
  service_provider: Libav
  Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s

Как я могу решить эту проблему?

Эрик Лещинский
источник
Что именно ты пытаешься сделать? Термин «concat» означает объединение нескольких файлов, но вы имеете в виду только один вход output1.mp4и один выход i0.ts. Кодирование в выходной контейнер ts будет использовать mpeg2videoкодировщик по умолчанию (по крайней мере, в вашей сборке), и в прошлый раз я проверял битрейт по умолчанию или настройку качества для этого кодировщика, -b:v 200kкоторая в большинстве случаев является слишком низкой.
Llogan
извиняюсь. Затем я соединяю их с помощью команды ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Но проблема в том, что качество уже плохое, когда я делаю ts-файлы
Возможно, вам не нужно перекодировать в MPEG-2 видео. Все ли ваши исходные данные ( output1.mp4и т. Д.) Имеют одинаковые форматы, частоту кадров и размер кадра?
llogan
Да, точно. Все равны
1
Смотрите также stackoverflow.com/questions/7333232/...
rogerdpack

Ответы:

36

Подумайте об использовании concatдемультиплексора . Таким образом, вы можете избежать создания временных промежуточных файлов с потерями и пропустить дополнительный этап перекодирования.

Примечание. Все входные данные должны иметь одинаковые типы потоков (одинаковые форматы, одинаковое время и т. Д.).

  1. Создайте текстовый файл и включите пути и имена каждого файла для объединения (или «объединения»). Пример файла input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Теперь вы можете использовать concatдемультиплексор:

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

Если у вас нет этой функции, то либо ваш ffmpeg слишком старый, либо вы используете «поддельный» ffmpeg из вилки libav.

Простые в использовании статические сборки доступны для Linux, OS X и Windows на странице загрузки FFmpeg , или вы можете следовать пошаговому руководству по компиляции ffmpeg .

Также см:

llogan
источник
Это именно то, что я хотел, и помог мне объединить файлы 2 .mov с моего iPhone 6. Спасибо.
Райан
7

Самый быстрый 1-лайнер будет:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4
Hackeron
источник
Есть ли шанс получить такой 1-onliner для командной строки Windows?
PeterCo
2
В Linux я использовал этот oneliner: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv принимает больше кодеков, чем mp4, но вы также можете попробовать это с mp4). Это -safe 0для последних версий ffmpeg, жалующихся на небезопасное имя файла , и -type fтолько для перечисления файлов. Я добавил | sortсортировать файлы по алфавиту; потому что findчитает их по порядку как сохраненные в файловой системе. Работает также для файлов с пробелами.
Эрик