Buat dua file mp4 dengan ffmpeg tanpa kehilangan kualitas

16

Saya ingin menggabungkan 2 video menggunakan ffmpeg. Saya menggunakan:

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

Tapi file mp4 yang saya dapatkan terlihat jauh lebih buruk daripada file sumbernya.

Berikut ini informasi tentang kedua file tersebut

   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

Bagaimana saya bisa menyelesaikan masalah ini?

Eric Leschinski
sumber
Apa yang sebenarnya ingin Anda lakukan? Istilah "concat" berarti menggabungkan beberapa file, tetapi Anda hanya merujuk pada satu input output1.mp4,, dan satu output i0.ts,. Pengkodean ke wadah keluaran akan menggunakan mpeg2videoencoder secara default (setidaknya dengan build Anda), dan terakhir kali saya memeriksa bitrate default atau pengaturan kualitas untuk encoder ini adalah -b:v 200kyang terlalu rendah untuk kebanyakan kasus.
llogan
Maaf. Kemudian saya concat mereka dengan ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Tapi masalahnya adalah kualitasnya sudah buruk ketika saya membuat ts-file
Anda mungkin tidak perlu menyandikan ulang ke video MPEG-2. Apakah semua input asli Anda ( output1.mp4, dll.) Memiliki format, laju bingkai, dan ukuran bingkai yang sama?
llogan
ya persis. Semuanya sama
1
Lihat juga stackoverflow.com/questions/7333232/…
rogerdpack

Jawaban:

36

Pertimbangkan untuk menggunakan concatdemuxer . Dengan cara ini Anda dapat menghindari membuat file-file sementara yang hilang dan melompati langkah tambahan pengkodean ulang.

Catatan: Semua input harus memiliki tipe aliran yang sama (format yang sama, basis waktu yang sama, dll.).

  1. Buat file teks dan sertakan jalur dan nama masing-masing file untuk menyatukan (atau "bergabung"). Contoh file, input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Sekarang Anda dapat menggunakan concatdemuxer:

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

Jika Anda tidak memiliki fitur ini, maka ffmpeg Anda terlalu tua, atau Anda menggunakan ffmpeg "palsu" dari garpu libav.

Bangun statis yang mudah digunakan tersedia untuk Linux, OS X, dan Windows via halaman unduh FFmpeg , atau Anda dapat mengikuti panduan langkah demi langkah untuk mengkompilasi ffmpeg .

Lihat juga:

llogan
sumber
Inilah yang saya inginkan dan membantu saya menggabungkan 2 file .mov dari iPhone 6. Terima kasih.
Ryan
7

1-liner tercepat adalah:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4
Hackeron
sumber
Adakah peluang untuk mendapatkan baris perintah 1-online untuk windows?
PeterCo
2
Di Linux saya menggunakan oneliner ini: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv menerima lebih banyak codec daripada mp4, tetapi Anda juga bisa mencobanya dengan mp4). Ini -safe 0untuk versi ffmpeg terbaru yang mengeluhkan nama file yang tidak aman , dan -type fhanya untuk daftar file. Saya menambahkan | sortuntuk mengurutkan file berdasarkan abjad; karena findmembacanya agar disimpan di sistem file. Juga berfungsi untuk file dengan spasi putih.
erik