Складіть два файли 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. Кодування до вихідного контейнера буде використовувати mpeg2videoкодер за замовчуванням (принаймні, для вашої збірки), і останній раз я перевіряв бітрейт за замовчуванням або налаштування якості для цього кодера-b:v 200k який у більшості випадків є занадто низьким.
llogan

вибачте. Тоді я стискаю їх з ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Але проблема в тому, що якість погана вже тоді, коли я роблю ts-файли

Можливо, вам не знадобиться повторно кодувати до MPEG-2 відео. Чи всі ваші оригінальні входи ( output1.mp4тощо) мають однакові формати, частоту кадрів та розмір кадру?
логікан

так, саме. Усі рівні

Відповіді:


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 .

Також дивіться:


Це саме те, що я хотів і допоміг мені об'єднати 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

Будь-який шанс отримати такий 1-онлінерний командний рядок для 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, які скаржаться на ім’я файлу Unsafe , і -type fє лише для переліку файлів. Я додав | sortдля сортування файлів за алфавітом; тому що findчитає їх у порядку, як збережено у файловій системі. Працює також для файлів з пробілами.
Ерік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.