ฉันสามารถเรียกใช้คำสั่ง FFmpeg พร้อมกันได้กี่อินสแตนซ์


18

ฉันเหนื่อยกับการรันคำสั่ง 8 แบบขนานเพื่อใช้ CPU อย่างเต็มที่และเร่งการแปลงวิดีโออย่างนี้:

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 ถึง 3 ของพวกเขาหยุด ทำไมสิ่งนี้ถึงเกิดขึ้น นี่เป็นข้อ จำกัด FFmpeg หรือไม่ ฉันได้ลองสิ่งนี้กับเครื่อง 16 core และ 4 core, EC2 c1.x large และ cc2.8xlarge พฤติกรรมเดียวกัน ฉันได้ลองใช้คำสั่งที่ซับซ้อนและคำสั่งที่เรียบง่ายยังคงเหมือนเดิมหยุด 2 หรือ 3


3
สำหรับความรู้ของฉันไม่ควรมีสิ่งใดใน FFmpeg ที่จะหยุดคุณไม่ให้ทำเช่นนั้น อาจเป็นปัญหาเชลล์หรือไม่?
slhck

ถ้าฉันมีอินพุตที่แตกต่างกันสำหรับแต่ละคำสั่งล่ะ ฉันจะทำให้พวกเขาเป็นอิสระเพราะถ้าหยุดพวกเขาทั้งหมดหยุด
แซมซั่น

คุณพบพารามิเตอร์ใด ๆ สำหรับการใช้โปรเซสเซอร์หลายตัวหรือไม่!
Dr.jacky

คุณหมายความว่าอย่างไรเมื่อ "หยุด" ที่นี่ ทุบตีแสดงพวกเขาเป็นหยุดชั่วคราว?
rogerdpack

คำตอบ:


21

ในการตอบคำถามเดิมว่าทำไมบางงานหยุด ffmpeg บนบรรทัดคำสั่งเป็นแบบโต้ตอบ มันอ่านค่าอินพุตบนบรรทัดคำสั่งอย่างต่อเนื่อง เพื่อให้คุณเรียกใช้ทั้งหมดในพื้นหลังคุณควรเปลี่ยนสิ่งนี้:

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

สำหรับสิ่งนี้:

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

การเพิ่ม</dev/nullบอกให้ ffmpeg ไม่ค้นหาอินพุตและงานทั้งหมดของคุณควรทำงานในพื้นหลัง


1
อะไรคือสิ่งนี้: 2> & 1
Dr.jacky

ขอบคุณมาก! ฉันมีปัญหาเดียวกันมากและสิ่งนี้ได้ผลเหมือนมีเสน่ห์ได้โปรดยอมรับ!
fr_andres รองรับMonicaCellio

3
@ Mr.Hyde ไปงานปาร์ตี้ที่ฉันรู้จัก แต่ 2> & 1 บอกให้สตรีมข้อผิดพลาดไปที่เดียวกันกับสตรีม stout - so / dev / null > /dev/null 2>/dev/nullมันเป็นชวเลข
berry120

7

แค่คิดในคำสั่งของคุณ: วิธีที่ง่ายกว่ามากในการตอกเครื่องด้วยคำสั่งเดียวคือการเชื่อมทุกอย่างเข้าด้วยกันเป็นบรรทัดเดียว:

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

คุณอาจต้องการเพิ่ม (ขึ้นอยู่กับรุ่น ffmpeg ของคุณ) ค่าสถานะเพื่อแจ้งให้เซิร์ฟเวอร์ใช้ตัวประมวลผลที่มีอยู่ทั้งหมด

-threads 0

สำหรับการอ้างอิง: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs


ฉันได้ลองสิ่งนี้แล้วมันไม่ได้ใช้โปรเซสเซอร์ทั้งหมดอย่างมีประสิทธิภาพ โหลดยังคงอยู่ที่ 20-30% ไฮเปอร์เธรดไม่ได้ใช้งานเลย
d33pika

2
อาจเป็นเรื่องที่เกี่ยวกับเครื่องจักร EC2 ใช่ไหม ฉันเพียงแค่เรียกใช้คำสั่งข้างต้นในเครื่อง 16 xeon core ที่มี 16 เอาต์พุตและนี่คือสิ่งที่ฉันได้รับ: ภาพหน้าจอ htop
NublaII

คุณอยู่ใน FFmpeg เวอร์ชันล่าสุดหรือไม่?
d33pika

@NublaII> / dev / null 2> & 1! คืออะไร
Dr.jacky

1
@ Mr.Hyde มันซ่อนเอาท์พุทมาตรฐานจากคุณและแสดงให้คุณเห็นข้อผิดพลาดออก อ่านสิ่งนี้: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Yuri Sucupira
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.