Paralel olarak kaç FFmpeg komutu örneği çalıştırabilirim?


18

CPU'yu tam olarak kullanmak ve Video dönüşümlerini hızlandırmak için 8 komutu paralel olarak çalıştırmaktan yoruldum:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/b.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/c.mp4 > /dev/null 2>&1  &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/d.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/e.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/f.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60  -f mp4 /mnt/g.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4  /mnt/h.mp4 > /dev/null 2>&1 &

2 ila 3 tanesi durdu. Bu neden oluyor? Bu bir FFmpeg sınırlaması mıdır? Bunu 16 çekirdekli ve 4 çekirdekli makinelerde denedim, EC2 c1.xlarge ve cc2.8xlarge. Aynı davranış. Karmaşık komutları ve basit komutları denedim, hala aynı, 2 veya 3 durdu.


3
Bildiğim kadarıyla FFmpeg'de bunu yapmanıza engel olan hiçbir şey olmamalıdır. Kabuk sorunu olabilir mi?
slhck

Her komut için farklı girişlerim varsa ne olur? Onları nasıl bağımsız yapabilirim, çünkü biri durursa hepsi durur.
Samson

Çoklu işlemcileri kullanmak için herhangi bir parametre buldunuz mu ?!
Dr.jacky

Burada "dur" demekle ne demek istiyorsun? bash onları duraklatılmış olarak gösterir mi?
rogerdpack

Yanıtlar:


21

Orijinal soruyu cevaplarken, bazı işlerin neden durduğuna ilişkin olarak, komut satırındaki ffmpeg etkileşimlidir. Komut satırındaki sürekli girişi okuyor. Hepsini arka planda çalıştırmanız için bunu değiştirmeniz gerekir:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &

buna:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 </dev/null > /dev/null 2>&1 &

eklenmesi </dev/nullffmpeg'e girdi aramamasını söyler ve tüm işleriniz arka planda çalışmalıdır.


1
Bu nedir: 2> & 1
Dr.jacky

Çok teşekkür ederim! Ben de aynı sorunu vardı ve bu bir cazibe gibi çalıştı, lütfen kabul edin!
fr_andres DesteklerMonicaCellio

3
@ Mr.Hyde Bildiğim partiye geç, ancak 2> & 1 hata akışına şişman akışla aynı yere gitmesini söyler - so / dev / null. Bunun için kestirme > /dev/null 2>/dev/null.
berry120

7

Komutunuzla ilgili bir düşünce: makineyi tek bir komutla çekiçlemenin çok daha kolay bir yolu, her şeyi tek bir satıra birleştirmektir:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 \
 -f mp4 /mnt/b.mp4 \
 -f mp4 /mnt/c.mp4 \
 -f mp4 /mnt/d.mp4 \
 -f mp4 /mnt/e.mp4 \
 -f mp4 /mnt/f.mp4 \
 -f mp4 /mnt/g.mp4 \
 -f mp4  /mnt/h.mp4 > /dev/null 2>&1

Sunucuya mevcut tüm işlemcileri kullanmasını bildirmek için (ffmpeg sürümünüze bağlı olarak) bir bayrak eklemek isteyebilirsiniz

-threads 0

Referans için: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs


Bunu denedim, tüm işlemcileri verimli bir şekilde kullanmıyor. Yük% 20-30'da kalır, hiper iplikler hiç kullanılmaz.
d33pika

2
Belki EC2 makineleriyle bir ilgisi var? Ben sadece 16 çıkışlı 16 xeon çekirdekli bir makinede yukarıdaki komutu çalıştırın ve bu ne olsun: htop screenshot
NublaII

FFmpeg'in en son sürümünde misiniz?
d33pika

@NublaII> / dev / null 2> & 1! Nedir?
Dr.jacky

1
@ Mr.Hyde Sizden standart çıktıyı gizler ve size hata çıktılarını gösterir. Bunu okuyun: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Yuri Sucupira
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.