Ubuntu'da birden fazla (ikiden fazla) video nasıl birleştirilir?


38

Videoları her biri yirmi (20) toplu büyüklüğünde birleştirmek istiyorum. Bir Linux makinesi çalıştırıyorum. Videolar mp4 formatında ve makul kalitede. Hatta bazılarında ses akışı bile yok. Şimdiye kadar ben denedim ffmpeg, mencoder, cvlc/vlcve MP4Box. Toplu işlem yaptığım için bunu gerçekleştirmek için bir komut satırı komut dosyası yazmak istiyorum.

Asıl mesele şu ki, denediğim çözümlerden bazıları iki video için iyi çalışıyor, bazıları ses akışı olan videolar için iyi çalışıyor, ancak diğerleri video setimin diğer bazı alt grupları için iyi çalışıyor. Ancak bu görev için kapsamlı bir çözüm bulamadım.


2
Lütfen birden fazla SE sitesinde aynı soruyu sormayın: superuser.com/questions/928548/…
Maythux

Şu ana kadar özellikle denediklerinizi gönderebilir misiniz?
ohaal

1
@ohaal ffmpegFiltreler ve dosya protokolleri dahil olmak üzere verilen çeşitli birleştirme yöntemlerini kullanmayı denedim . Ben de concatözelliğini kullanmayı denedim cvlc/vlc. Ben de concatözelliğini denedim mencoder. Bunların hepsi kısmen çalıştı. Bu nihayet meseleyi çözmeme yardım etti.
Dhruv Singal

Evet, araçlardan zaten bahsettiniz, demek istediğim koştuğunuz gerçek komutlardı. Ayrıca gelecekteki ziyaretçiler için, sizin için (cevabınıza) çözerek sona eren emri de dahil etmek harika olurdu.
ohaal

Aah, amacını anlıyorum. Ne yazık ki, tam sayı nedeniyle komutları listeleyemiyorum. melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Sorunumu

Yanıtlar:


41

mkvmergeBirden fazla MP4 dosyasını tek bir dosyaya katmak için kullanıyorum :

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4

3
.mkvÇıktı dosyası için uzantıyı kullanmak daha iyidir , çünkü verdiğiniz uzantıdan bağımsız olarak bir Matroska kabıdır.
haridsv

İşte nasıl yükleneceği mkvmerge: tipsonubuntu.com
Morgoth

Sadece bu komut mkvmerge çalışır. Tüm ffmpeg olanlar en az kaydırılmış sesle başarısız oluyor.
42n4

25

Bunu kullanarak yapabilirsiniz ffmpeg:

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

referans ve daha fazla bilgi


2
Bunu yapmaya çalıştım. Bununla ilgili sorun, düzgün bir şekilde ortaya çıkmamasıdır. 1. Ses parçaları karışmış. 2. Video parçasında biraz rahatsızlık var.
Dhruv Singal

Daha fazla örnek için kullandım, sonuç yüksek kalitede, belki de kaynak video kaliteniz sorun mu?
Maythux

Muhtemelen haklısın. Bu sorunu çözdü: askubuntu.com/a/637179/420614
Dhruv Singal

2
MP4'ü birleştirmek için concat protokolünü kullanmayın. Yalnızca çoğu genel kullanıcının karşılaşmadığı belirli biçimlerde çalışır. Kullanın concat demuxer veya concat filtresi yerine.
lgagan

Her biri 30 dakikalık 2 mp4 dosya içeren ffmpeg'i denedim. 7 saat uzunluğunda bir çıktı dosyası aldım.
Guus


4

MP4'leri ffmpeg kullanarak kod çözmeden eşleştirmek için küçük bir kabuk betiği yazdım.

for f in $(ls *.MP4); do
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")

ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4

rm *.ts

Bu, bir MPEG kabında ara dosyalar oluşturur ve sonra onları bir MP4'te birleştirir.


Dosya adlarından herhangi biri boşluklar içeriyorsa veya bazı durumlarda özel karakterler içeriyorsa, bu komut dosyasının başarısız olacağını unutmayın. Döngü için, sadece kullanmak önemli ölçüde daha iyi olduğunu for f in *.MP4kullanmadan ls. (Her zaman kullanmaktan kaçınmalısınız lsönemli nedenlerinden bir çift için komut; daha iyi seçenek vardır.) Ayrıca, değişkenler için kullanılması tırnak sen olmadıkça belirli boşluk veya diğer özel karakterler, bu yüzden olduğunu "${f}"(ya da sadece "$f") yerine tırnaksız $f.
Paddy Landau

CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")Hangi dosya isimleri pek çalışmıyor 1, 2, 3 ... 10 ... 20. Ben önermek vs ... 1 10 ... 2, 20 olarak ayrıştırma biter CONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")bu sipariş sağlayacaktır .
tisaconundrum

2

Aşağıdaki şekilde birleştirmek istediğiniz tüm dosyaları içeren bir files.txt dosyası oluşturun (# ile başlayan satırlar yoksayılır):

# this is a comment
file 'file1.mp4'
file '/path/to/file2.mp4'
file 'file3.mp4'

Bunların göreceli veya mutlak yollar olabileceğini unutmayın. Ardından dosyalarınızı kopyalayabilir veya yeniden kodlayabilirsiniz:

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4

0

Benim senaryom, tamamen bashve ffmpeg. Bir komut satırında verilen dosyaları bir tanesine yeniden kodlar.

Dosyaların aynı çözünürlükte olmasını gerektirir. Farklı meta veri dönüşünü kabul eder, ki ffmpeg concat:bu değildir.

rm ffmpeg-concat-output.mkv

FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
    echo "Processing ${FNAME}"
    INPUTS="${INPUTS} -i $FNAME"

    if [ -z "${FILTER}" ]; then
        FILTER="[$INDEX:v:0] [$INDEX:a:0]"
    else
        FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
    fi
    let INDEX+=1
done

COMMAND="ffmpeg ${INPUTS} \
    -filter_complex '${FILTER} \
        concat=n=${INDEX}:v=1:a=1 [v] [a]' \
    -map '[v]' -map '[a]' \
    ffmpeg-concat-output.mkv"

#   -af 'volume=15dB' # won't work with -filter_complex

bash -c "${COMMAND}"


-1

Maythux cevabı, ek olarak gelen :

Birkaç multimedya kabı (MPEG-1, MPEG-2 PS, DV), yalnızca onları içeren dosyaları birleştirerek videoyu birleştirmeye izin verir.

Yani bir araya getirilecek videolar, yukarıda belirtilen video kaplarından birini kullanır (kişisel deneyim için MPEG-4 Bölüm 14 ekleyeceğim), basitçe:

cat video1.ext video2.ext video3.ext > video4.ext

1
Bunu denedim ama yalnızca ilk videoyu çıktı olarak döndürüyor. İşe yaramadığını bir yerlerde okudum, ancak bunun arkasındaki mantığı hatırlamıyorum.
Dhruv Singal,

@DhruvSingal Evet, bunu doğrulayabilirim, aynı MPO videoda aynı video / ses kodlamasını denedim ve senin gibi sadece ilk videoya göz atabileceğim gibi. Bu mantıklı görünüyor, ancak birkaç kez MP4 video ile daha önce bir kez yaptığımdan eminim. Belki de hafıza burada iyi hizmet vermiyor veya bunun çalışması için başka şartlar da var. Bu konuda da araştırma yapmak istiyorum, çünkü ilgileniyorum, eğer bir şey bulursam cevabı günceller ve size bir yorum
bırakırım

Bir şekilde, birleştirilmiş filmin tüm uzunluğu ve muhtemelen başka şeyleri kapsayacak şekilde ilk videonun başında meta verileri değiştirmemiz gerekiyor. Sadece birkaç mpeg4 dosya meta verilerini görmeme izin verdi ..
Ken Mollerup
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.