Kaliteyi kaybetmeden ffmpeg ile iki mp4 dosyasını kapat


16

Ffmpeg kullanarak 2 video birleştirmek istiyorum. Ben kullanıyorum:

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

Ama aldığım mp4 dosyası kaynak dosyadan çok daha kötü görünüyor.

İşte her iki dosyayla ilgili bilgiler

   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

Bu sorunu nasıl çözebilirim?


Tam olarak ne yapmaya çalışıyorsun? "Concat" terimi birkaç dosyayı birleştirmek anlamına gelir, ancak yalnızca bir giriş output1.mp4ve bir çıkıştan bahsediyorsunuz i0.ts. Ts çıkış kapsayıcısına kodlama mpeg2videovarsayılan olarak (en azından derlemenizle) kodlayıcıyı kullanır ve bu kodlayıcı için varsayılan bit hızını veya kalite ayarını en son kontrol ettiğimde -b:v 200kçoğu durumda çok düşüktür.
llogan

afedersiniz. Sonra ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4 ile onları concat. Ancak sorun, ts dosyaları

MPEG-2 videosuna yeniden kodlamanız gerekmeyebilir. Tüm orijinal girişleriniz ( output1.mp4vb.) Aynı biçimlere, kare hızına ve kare boyutuna sahip mi?
llogan

Evet kesinlikle. Hepsi eşit

Yanıtlar:


36

concatDemuxer'ı kullanmayı düşünün . Bu şekilde geçici, kayıplı ara dosyalar oluşturmaktan kaçınabilir ve fazladan yeniden kodlama adımını atlayabilirsiniz.

Not: Tüm girişler aynı akış türlerine sahip olmalıdır (aynı formatlar, aynı zaman tabanı vb.).

  1. Bir metin dosyası oluşturun ve birleştirilecek (veya "birleştirilecek") her dosyanın yollarını ve adlarını ekleyin. Örnek dosya, input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Şimdi concatdemuxer'ı kullanabilirsiniz :

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

Bu özelliğe sahip değilseniz, ya ffmpeg'iniz çok eski ya da libav çatalı "sahte" bir ffmpeg kullanıyorsunuz.

Linux, OS X ve Windows için kullanımı kolay statik derlemeler FFmpeg indirme sayfası üzerinden kullanılabilir ya da ffmpeg'i derlemek için adım adım kılavuzu takip edebilirsiniz .

Ayrıca bakınız:


Bu tam olarak istediğim şeydi ve iPhone 6'dan 2 .mov dosyalarını birleştirmeme yardımcı oldu.
Ryan

7

En hızlı 1-astar:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4

Windows komut satırı için böyle bir 1-onliner almak için herhangi bir şans?
PeterCo

2
Linux'ta bu oneliner'ı kullandım: ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv(mkv, mp4'ten daha fazla kodek kabul eder, ancak mp4 ile de deneyebilirsiniz). -safe 0Şikayet son ffmpeg sürümleri içindir Güvensiz dosya adı ve -type fdosyaları listeleme içindir. | sortDosyaları alfabetik olarak sıralamak için ekledim ; çünkü findbunları dosya sistemine kaydedildiği gibi okur. Beyaz boşluklu dosyalar için de çalışır.
erik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.