FFmpeg kullanarak bir video oluşturmak için bir görüntü + bir ses dosyası birleştirin


183

Bu oldukça önemsiz olmalı, ancak işe yaraması için bir yol bulamıyorum.

FFmpeg'in bir JPEG görüntü ve bir ses dosyasını giriş olarak çekmesini ve ses dosyasıyla aynı süre içinde bir video dosyası oluşturmasını istiyorum (hareketsiz görüntüyü tüm süre boyunca uzatarak).

Hangi video kod çözücüsünün çıkış için kullanıldığını pek umursamıyorum, ancak ses kod çözücüsü olarak "kopya" özelliğini kullanabilmem çok önemli (yani ses akışını kodlamadan kopyalamak).

Bunu yapan doğru komut satırı nedir?

Denedim:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

ve olan ve olmayan kombinasyonlar çok çalıştı -s 640x360, -loop_input, -shortest, -t xxx, -r 0.1(video daha uzun olacağı umuduyla yapay olarak düşük kare hızı) ve-f image2

Ya hatalar alıyorum ya da bir kare sürenin bir video dosyasını alıyorum.

Etrafta dolandım ve hiçbirinin işe yaramadığı bir düzine önerilmiş çözüm buldum (sözde bu aynı soru için).

Herhangi biri çalışma emrini önerip arkasındaki mantığı açıklayabilir mi?


Komut satırınızı yeni denedim ve beklendiği gibi çalıştı. Sorununuz ses biçiminde olabilir. Sesin kodlanması işe yarıyor mu?
Kaptan Zürafa,

"Beklendiği gibi" ile, sonuçta elde edilen videonun ses girişi ile aynı süreye sahip olduğunu mu kastediyorsunuz? Oynadın mı Tek kare uzun değil mi?
matteo

Ses formatı sorun değil, sesin
kodunu değiştirme

Ben de bir param sorunu sorunum vardı ve bu bana saatler verdi! Ne yazık ki bu tür problemler yardımda yer almıyor. gregoire.org/2009/12/05/fun-with-ffmpeg
Paul Gregoire

3
bu seçilen cevaptan daha iyi, denedim ve hızlı ve dosya boyutu küçük ..ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Muhammad Umer

Yanıtlar:


145

Komut satırındaki seçeneklerin sırası önemlidir. Davam için aşağıdakiler çalışıyor:

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi

Daha genel bir durumda, girişiniz nerede image.jpgve nerede , FFmpeg wiki'denaudio.wav uyarlanmış aşağıdaki komutu kullanabilirsiniz :

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

Bu, libx264kodlayıcıyı kullanır ve yukarıda kullanılan MJPEG kodeğinden daha iyi sıkıştırma sağlar. Ses, dahili ffmpegAAC kodlayıcı ile AAC'dir.


5
Dosyalar neden [görüntünün boyutu] + [ses dosyasının boyutu] 'dan daha büyük hale geliyor? Video sıkıştırma sabit bir çerçeve ile çıldırtmak ister misiniz?
Alec Jacobson

2
Kullandığınız video kodeğine bağlıdır. Örneklerimdeki komutları kopyalıyorsanız, her kareyi ayrı ayrı sıkıştıran codec bileşeni olarak mjpeg kullanıyorum, bu nedenle tüm karelerin eşit olması gerçeğinden faydalanmıyor. Ayrıca, diğer kodeklerin bile tüm kareyi arada bir yeniden kodlayacağını düşünüyorum, yani her N-inci karesinde, böylece çok daha küçük bir dosya elde edersiniz, ancak yine de görüntü + ses boyutundan çok daha büyük olur. Bunu yaparlar çünkü (a) aksi takdirde, son kareye atlamak isteseniz bile, kod çözücünün başından itibaren tüm dosyayı okuması gerekir ve
matteo

2
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
wim

2
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avibu daha iyi çalışır !!! kullanın !!!
Muhammad Umer

2
Bu cevap şu anda meta üzerinde tartışılmaktadır .
DavidPostill

41

Bunu yapıyoruz yolu zor olması gerekenden daha. FFmpeg kredi verdiğinizden çok daha zeki - videonun ses izinizle aynı uzunlukta olmasını istediğinizi biliyor.

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

Sadece nitelikler Eğer varsa belirlemek sayılabilir input filenames, output codecsve output filename(ki , eo ipso içerir output container).

Elbette, nihai videonuzla aynı boyutları paylaşan hareketsiz bir görüntüyle başlamak mantıklıdır; FFmpeg için çıkış boyutlarını belirlemek yerine özel bir resim düzenleyici kullanıyorsanız, giriş boyutlarınızın çift sayı olduğundan emin olmanız gerekir .

Çıktı boyutu, FFmpeg'in en yaygın bağlantılarından biridir; bazı kodlayıcılar çıktı boyutlarında diğerlerinden daha kısıtlıdır, ancak hiçbir çıktı tek sayı yükseklik ya da genişlik niteliklerine sahip olamaz.

pauseKomut toplu dosyanın sonuna CLI; açık tutar - komut satırı hata ayıklamak için en iyi yolu hata mesajlarını okuyarak olduğu o üretir. Bunlar son derece spesifik - ve FFmpeg'in sahip olduğu en iyi dökümantasyon - ancak pencereyi kapatmadan önce okuyabilmeniz için geliştiricilerin zor işleri boşa harcanıyor.

Komut kabuğunda , cmd /kaynı komutları toplu komut dosyasından komut isteminde çalıştırabileceğiniz açık bir pencereyi tutan bir anahtar bulunur .

FFmpeg ve avconv hem kullandığınız yapacak -c:aiçin -acodecve -c:viçin -vcodecsonunda ama kullandığım kurar eski talimatlar iyi çalışır.

Nota Bene: Her işin kendine özgü özelliği vardır. Komut satırınız belirgin bir nedenden ötürü başarısız oluyorsa, başka bir yapı denemek ya da FFmpeg'in en aktif geliştiricilerinin son birkaç yıldır aktif olduğu libav'a giden çatalı takip etmek yararlı olacaktır . Kod dönüştürme aracı avconv olarak yeniden adlandırıldı, ancak toplu iş dosyalarınız ikisiyle de çalışmalıdır.


Senden farklı bir sürüm kullanıyor olmalıyım (emrini denediysen ve açıkladığın gibi çalışıyorsa), çünkü daha önce de bahsettiğim gibi, aynı emrini zaten denemiştim ve sürenin videosunu aldım. 1 kare (saniyenin bir bölümü), ses dosyasının süresi DEĞİLDİR. Akıllı olmasını bekledim, ancak (benim sürümümde) olmadığı kanıtlandı.
matteo

2
Hey Matteo , evet, bu kodu yaptım ve evet, ilan edildiği gibi çalışıyor. Eminim ki onları sınamadan bu tür iddialarda bulunacak kadar dikkatsiz olacak bir çok yarıçap olduğundan eminim, bu yüzden rahatsız edilmemeye çalışacağım :) Aşağıdaki yazının tamamında Pastebin'e FFmpeg konsol çıktısına ve MediaInfo'ya bağlantı sağlayacağım giriş dosyalarındaki ve son çıkış dosyalarındaki veriler. FFmpeg yapınıza karşı test etmek istiyorsanız , giriş dosyalarım, toplu iş dosyam, çıktı dosyam GoogleDrive'da ücretsiz olarak indirilebilir .

@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53Ne sizin çözümünüz ne de @matteo çözümü benim için çalıştı. Ayrıca, dosyalarınızı Google Drive'dan indirdim, ancak beklenen çıktıyı vermedi (çıktı dosyası yalnızca ses içeren siyahtı). Lütfen kullanılacak doğru komutu bulmama yardım et.
coding_idiot

2
"hiçbir çıktı tek sayı yüksekliğinde ya da genişlik özelliklerinde olamaz" Doğru değil. Pix_fmt'yi rgb24 veya yuv444p gibi chroma alt örneklemesine sahip olmayan bir şeye ayarlayın, ardından kodek ve kabın desteklediğinden ve başka kısıtlama bulunmadığından emin olun. Pix_fmt ile ilgili olarak, FFmpeg akıllıdan daha azdır; Aksi söylemediğiniz sürece yuv420p (ki kroma alt örneklemeli) varsayılır.
Jonathan Baldwin,

birden fazla görüntüden ne haber? Belirli bir zamanda başka bir resme geçmek için resme ihtiyacım var. Bunları komut satırında her biri için bir zaman parametresiyle belirtebilmek istiyorum.

36

Daha da kolay:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpeg, çıktı dosyanızın uzantısına bağlı olarak en iyi codec bileşenini otomatik olarak seçmeye çalışır.

Güncelleme: YouTube’un videoyu işlemekte zorluk çektiğini farkettim (% 95’de takılıyor) Sanırım sadece bir kare var. YouTube'u mutlu etmek için bulduğum çözüm: daha fazla çerçeve ekle. Ayrıca -acodec copyses kalitesini korumak için ekledim . İhtiyacın var -shortestya da sonsuza dek sürüyor. (Görüntü döngüsü sonsuz olduğundan, ses olan en kısa akışın sonunda durur.) Filtreler (ve benzeri) belirttiğiniz sırayla işlendiğinden, seçeneklerin sırası hız için çok önemlidir. Bu parametrelerin sırasını değiştirirseniz, sonuçlar çok farklıdır.

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

Ayrıca kare hızını iki kez ayarladığımı da fark ettim, bu bir kaza değil - ilk kare hızı girdi, ikincisi çıktı için. Bunu doğru yaparsanız, videonun saniyede yalnızca bir kare olması gerekir; bu, göreceli olarak hızlı kodladığı anlamına gelir. Ayrıca burada çözünürlüğü 720p olarak ayarlıyorum, bu YouTube’da HD ses almanız gerektiği anlamına geliyor :-)


Ayrıca, ses dosyanızın .flv kabınızla uyumlu olmaması da mümkündür. Bu durumda, ses dosyanızla uyumlu bir kap formatı bulana kadar .webm, .avi veya her türlü format gibi farklı (çıkış) bir kapsayıcıyı denemelisiniz.
PJ Brunet

1
Bir MP4 yapmak için bir .JPG ve .MP3 için kullanılır - mükemmel çalıştı. JPG / MP3'ten yarattığım FLV işe yaramadı - önceki yorum uyarısına göre olabilir.

2
Güncellenmiş sürümü, Youtube için çalışıyor. % 95 oranında sıkışmış olduğunu düşündüm ama sonunda işe yaradı.
Basj

bu aldım: No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)... bu işler:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
NineCattoRules 03:17

birden fazla görüntüden ne haber? Belirli bir zamanda başka bir resme geçmek için resme ihtiyacım var. Bunları komut satırında her biri için bir zaman parametresiyle belirtebilmek istiyorum.

14

Benim için çalışan sürüm:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

-shortestAşağıdaki hatayı alamazsam, seçeneğin çıktı dosyasının önünde olması gerekir.

En kısa seçenek (en kısa giriş içinde bitirme kodlaması) giriş dosyasına pic.jpg uygulanamaz - bir çıkış dosyasına bir giriş seçeneği uygulamaya çalışıyorsunuz ya da tam tersi. Bu seçeneği ait olduğu dosyadan önce taşıyın. Giriş dosyası pic.jpg için ayrıştırma seçenekleri.


Bunun için teşekkürler. Diğer cevapların çoğu benim için işe yaramadı (Alpine linux üzerinde ffmpeg kullanarak). Bu cevap benim için kusursuz çalışan en kısa emre sahiptir.
DannyB,

8

Ffmpeg kılavuz sayfasından:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

Siz keşfettiğiniz gibi, dosya seçenekleri, başvuruda bulundukları dosyadan önce gelmelidir.

Ancak bu bir hata değildir, sadece hangi dosya argümanlarının uygulanacağını belirleyebileceğiniz bir mekanizmadır.


birden fazla görüntüden ne haber? Belirli bir zamanda başka bir resme geçmek için resme ihtiyacım var. Bunları komut satırında her biri için bir zaman parametresiyle belirtebilmek istiyorum.

4

Bu benim için çalıştı

ffmpeg - döngü 1 - en kısa - y - i image.jpg - i audio.mp3 - acodec kopyası

Vcodec'in libx264çok daha küçük dosyalar oluşturduğunu gördüm mpjeg(100 MB yerine 10 MB).


1
-shortestbir çıktı seçeneğidir ve kullandığınız gibi bir giriş seçeneği olarak göz ardı edilebilir.
llogan

1

@Matteo olarak yapmaya çalışıyordum , ama ses olmadan ve @Colonel Panic'in çözümü en iyi sonucu verdi:

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

Sadece saniye cinsinden bir süre argümanı eklemek zorunda kaldım ( -t 10).


-shortestçıkış seçeneği, ancak bunu bir giriş seçeneği olarak kullanıyorsunuz. Çıktı dosyasından önce onu taşıyın ve ortadan kaldırabilirsiniz -t 10, ancak sonra cevabınız diğerleriyle hemen hemen aynı olacaktır.
llogan

0

ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4


5
Eklediğiniz komutun nasıl çalıştığını açıklayabilir misiniz?
neelsg

Bu cevap, buradaki diğer basit "yorum cevaplarından" çok farklı değildir.
llogan

0

Birinin toplu dönüştürmek istemesi durumunda, bunu deneyin.

Giriş ve çıkış Klasörünü ve ayrıca videonun içinde olmasını istediğiniz formatı ayarlayabilirsiniz. Bu durumda AVI olarak ayarlarım.

Bu cevap FFmpeg kullanarak bir video yapmak için bir resim + bir ses dosyası birleştirin bana çok yardımcı oldu.

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD

-1

Bu komutu dene. Benim için çalıştı.

-y -i /storage/emulated/0/images.jpg -i /storage/emulated/0/audio.wav -acodec aac -vcodec mpeg4 -s 480*320 -f mp4 -r 2 /storage/emulated/0/output.mp4"

2
Bu, işe yaramayan tamamlanmamış bir komuttur. Komutunuzu düzeltip hata ayıklayabilsem de, çalışmanızı sizin için yapmayacağım, bu nedenle lütfen cevabınızı düzenleyin ve kendiniz düzeltin. Video boyutunuzun Matteo'nun istediği gibi olmadığını da fark ettim.
karel
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.