ฉันจะดึงรูปภาพจากช่วงเวลาหนึ่งของวิดีโอใน Xubuntu 16.04 ได้อย่างไร?


8

ฉันกำลังมองหาตัวเลือกบรรทัดคำสั่ง

ตัวอย่างเช่นหากฉันมีวิดีโอsample-video.mp4และฉันต้องการสร้างไฟล์ภาพsample-image.jpgจากวิดีโอในเวลา 00:00:26 ฉันควรจะให้คำสั่งอะไร

นอกจากนี้มันจะมีประโยชน์มากหากคุณสามารถอธิบายโดยละเอียดว่าฟังก์ชันของอาร์กิวเมนต์ทุกคำสั่งคืออะไร


2
ตามคำถามนี้และคำตอบของมันffmpegดูเหมือนจะสนับสนุนชื่อไฟล์สำหรับผลลัพธ์
IQV

คำตอบ:


8

คุณสามารถใช้mplayer(จากแพ็คเกจmplayerไม่ได้ติดตั้งโดยค่าเริ่มต้น):

mplayer -vo jpeg -ss 00:00:26 -frames 1 sample-video.mp4

สิ่งนี้จะสร้างไฟล์00000001.jpgเพื่อให้คุณต้องเปลี่ยนชื่อ เท่าที่ฉันรู้ไม่มีวิธีระบุชื่อไฟล์

-vo jpegหมายความว่าคุณต้องการเอาต์พุต JPEG -ss 00:00:26ค้นหาตำแหน่งที่กำหนด-frames 1หมายถึงดำเนินการหนึ่งเฟรมแล้วออก


ข้อดีของการได้รับมากกว่า 1 เฟรมคืออะไร สิ่งเหล่านี้จะถูกคัดลอกหรือแต่ละเฟรมจะแตกต่างกันในหนึ่งวินาทีหรือไม่?
Sonevol

รูปภาพที่สร้างจากเฟรมเพิ่มเติมจะแตกต่างกันไปในเสี้ยววินาที ค่าที่แน่นอนขึ้นอยู่กับวิดีโอ
Florian Diesch

5
@Sonevol เฟรมตรงเวลา 0:00:26 อาจไม่ตรงกับที่คุณต้องการ คุณอาจต้องการใช้ ~ 50 เฟรมระหว่าง 0:00:25 ถึง 0:00:27 (หรือเพียงแค่ 3-4 เฟรมรอบเครื่องหมาย 0:00:26) จากนั้นเรียกดูเฟรมเหล่านั้นเพื่อเลือกเฟรมที่ดีที่สุด
xDaizu

1
@FlorianDiesch เป็นไปได้ที่จะส่งออกไปยัง png ด้วยสิ่งที่ชอบ: -vo png:z=9ด้วยการตั้งค่า -z ระบุระดับการบีบอัด สำหรับ JPEG -vo jpeg:quality=100คุณยังสามารถเพิ่มในการตั้งค่าที่มีคุณภาพ: แต่คำตอบของคุณยอดเยี่ยมมากเหมือนเดิม :)
แอ

13

คุณสามารถใช้ffmpeg

ffmpeg -loglevel quiet -ss 26 -i sample-video.mp4  -t 1 -f image2 anyfilename.jpeg
  • -loglevelตั้งค่าล็อกเอาต์เอาต์ให้เงียบเนื่องจาก ffmpeg ช่างพูดมาก
  • -ssคือการค้นหา (ในไม่กี่วินาทีคือที่ที่คุณต้องการถ่ายภาพ)
  • -iไฟล์วิดีโออินพุต
  • -tกรอบเวลาของสแน็ปช็อต (เป็นวินาที)
  • -f ประเภทไฟล์

นอกจากนี้คุณยังสามารถเล่นรอบกับตัวเลือกเช่นการควบคุมคุณภาพของการส่งออกในไฟล์ jpeg หรือความละเอียด-q:v <linear integer 1-10> -s 480x300

แนวคิดเพิ่มเติมที่นี่


วิธี VLC

cvlc sample-video.mp4 --start-time=26 --run-time=1 --rate=1 --video-filter=scene --vout=dummy --aout=dummy  --scene-ratio=24 --scene-prefix=sample-image --scene-replace vlc://quit
  • cvlc - เพราะบรรทัดคำสั่งและเราไม่ต้องการเปิดหน้าต่างใด ๆ นอกจากนี้ยังหมายความว่าเราสามารถรันได้โดยไม่ต้องใช้ X11

  • - เริ่มเวลา = 26 - เป็นตำแหน่งที่แน่นอนของภาพรวมในไม่กี่วินาที

  • --run-time = 1 - ระยะเวลาที่วิดีโอจะ "เล่น" ในไม่กี่วินาที เราเล่นเป็นเวลาหนึ่งวินาทีเพื่อสร้างภาพหน้าจอของวินาทีนี้
  • - อัตรา = 1เมื่อจะถ่ายภาพหน้าจอ โดยทั่วไปหมายถึง "ทุก ๆ วินาที" และมีประโยชน์ถ้าคุณมีไฟล์ที่ยาวกว่าเพื่อถ่ายภาพหน้าจอทุก ๆ 60 วินาทีหรือทุกๆ 5 นาที
  • --video-filter = sceneบอก VLC ว่าเราต้องการถ่ายภาพหน้าจอ
  • --vout = จำลองไม่แสดงผลสำหรับวิดีโอใน X11 เราไม่ต้องการ
  • - aout = dummyไม่มีเอาต์พุตสำหรับเสียงเราไม่ต้องการมัน
  • --scene-ratio = 24 เราบอก VLC ว่ามีประมาณ 24 เฟรมต่อวินาที
  • --scene-prefix = sample-image ชื่อไฟล์ของภาพหน้าจอของคุณ
  • --scene-replace แทนที่ไฟล์ใด ๆ ที่เรียกว่าหน้าจอsample-image.pngของคุณด้วยภาพหน้าจอปัจจุบันของคุณ หากคุณไม่ใช้สิ่งนี้ VLC จะเริ่มนับภาพหน้าจอ
  • vlc: // ออก จากออกจาก vlc เมื่อเราทำเสร็จแล้ว

กรอกเอกสารที่นี่


คุณหมายถึงอะไรโดยช่างพูด? และฉันต้องการสแนปช็อตในวันที่ 26 วินาที เหตุใดจึงต้องระบุกรอบเวลาโดย -t ฉันกำลังถ่ายรูปไม่ใช่วิดีโอ
Sonevol

3
"Chatty" เพราะ ffmpeg พิมพ์ออกบันทึก 40 บรรทัดด้วยคำสั่งนี้เช่นเวอร์ชันปัจจุบันประเภทการตั้งค่าและข้อมูลเกี่ยวกับไฟล์วิดีโออินพุต - ซึ่งไม่น่าสนใจสำหรับคุณ คุณอาจละเว้น "-t 1" เพื่อจุดประสงค์ของคุณ ดูเหมือนว่าค่าเริ่มต้นคือหนึ่งวินาทีหรือเศษส่วนของซึ่งเป็นสิ่งที่ดีสำหรับภาพหน้าจอ ความแตกต่างที่ดีคือความเป็นไปได้ในการกำหนดชื่อไฟล์ที่ส่งออกและคุณภาพ / ความละเอียดที่ปรับแต่ง ฯลฯ
Robert Riedl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.