แยก“ หนึ่งในทุก ๆ 10 เฟรม” ในวิดีโอโดยใช้ VLC หรือ FFmpeg


12

ฉันพยายามแยก "เฟรม 1 เฟรมของทุก ๆ 10" ของวิดีโอ (เช่นแยก 1 ออกจาก 9 จากนั้นทำซ้ำ) เพื่อวัตถุประสงค์ทางวิทยาศาสตร์ วิดีโอคือ 105 เฟรม, 3.5 วินาที, 29.97fps (h.264, .mov ผลิตโดย Nikon D3100)

ฉันได้อัปโหลดได้ที่นี่

VLC

คำสั่งด้านล่างควรสร้าง 10 เฟรม แต่สร้างได้เพียง 6 ภาพเท่านั้น ฉันลองอัตราส่วนฉากที่แตกต่างกันและไม่มีเฟรมใดสร้างจำนวนเฟรมที่ถูกต้อง

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

ใครช่วยกรุณาบอกฉันว่าปัญหาคืออะไร?

FFmpeg

FFmpeg ดูเหมือนจะไม่ได้มีคำสั่งตรงตามวัตถุประสงค์ของฉัน คำสั่งด้านล่างแยก 3 เฟรมออกจากทุก ๆ วินาที แต่เนื่องจาก FPS ไม่ตรง 30 (แทนที่จะเป็น 2.97) นั่นจะไม่ให้ผลลัพธ์ที่ถูกต้องสำหรับฉัน

นอกจากนี้ FFmpeg ยังไม่ได้ให้จำนวนเฟรมที่ถูกต้องด้วยแม้แต่คำสั่งนี้ สำหรับวิดีโอ 3.5 วินาทีฉันคาดว่ามากที่สุด 10 เฟรม แต่สิ่งที่ฉันได้คือ 12 เฟรม!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

ฉันจะบรรลุสิ่งที่ฉันต้องการได้อย่างไร


1
BTW -sameqไม่ทำในสิ่งที่คุณคิดว่าทำได้และถูกลบออกจากเวอร์ชั่นปัจจุบัน (ffmpeg ตัวจริงนั่นคือฉันไม่แน่ใจว่ามันอยู่ใน ffmpeg ปลอมของ Ubuntu หรือไม่) ใช้ qscale แทน
stib

คำตอบ:


21

เลือก 1 เฟรมจากทุก ๆ 10 เฟรม

คุณสามารถใช้selectตัวกรองวิดีโอffmpegเพื่อทำสิ่งนี้:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • สำหรับการส่งออก JPG -q:vคุณสามารถแตกต่างกันที่มีคุณภาพด้วย ช่วงที่มีประสิทธิภาพคือ 2 (คุณภาพดีที่สุด) ถึง 31 (คุณภาพแย่ที่สุด) คุณไม่จำเป็นต้องใช้ตัวเลือกนี้หากคุณต้องการส่งออกไปยัง PNG แทน

  • นี้ออกจะimg_001.jpg, img_002.jpg, img_003.jpgฯลฯ


ดูน่าสนใจมาก แต่ดูเหมือนว่าจะต้องมีบางเวอร์ชั่นหรือคอมไพล์อินพิเศษ ฉันได้รับ " unrecognized option '-filter:v'" กับ "FFmpeg รุ่น SVN-r0.5.1-4: 0.5.1-1ubuntu1.3" (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib - เปิดใช้งานได้ -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis - เปิดใช้งาน -pthreads --enable-zlib - ปิดการใช้งาน -disable-vhook - เปิดใช้งาน -cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared -disable-static)
mivk

ฉันยังไม่สามารถเรียกใช้คำสั่งและรับข้อผิดพลาดต่อไปนี้บน ffmpeg windows N-35709-g7d531e8: [select @ 017EBB00] [Eval @ 0022DC08] ไม่มี 'หรือ' args มากเกินไปใน 'mod (n \, 10))' [ select @ 017EBB00] เกิดข้อผิดพลาดขณะแยกวิเคราะห์นิพจน์ 'ไม่ (mod (n \, 10))' ข้อผิดพลาดในการเริ่มต้นตัวกรอง 'เลือก' ด้วย args 'ไม่ (mod (n \, 10))' ข้อผิดพลาดในการเปิดตัวกรอง!
wmac

@mivk เวอร์ชัน FFmpeg ของคุณจาก repo Ubuntu ไม่มีความสามารถในการกรอง คุณจะต้องรวบรวม FFmpeg
llogan

1
@wmac ฉันเดาว่า Windows ไม่ชอบราคาเดียว "เปลี่ยนเป็นคำพูดสอง:
llogan

1
@ LordNeckbeard ขอบคุณมันทำงานถูกต้องและแก้ไขปัญหาทั้งหมด ฉันซาบซึ้งในความช่วยเหลือของคุณจริงๆ
wmac

4

สิ่งที่สำคัญที่สุดสำหรับคำถามของคุณคือวิดีโอใช้ 29.97 เฟรมต่อวินาทีไม่ใช่ 30 น่าเบื่อ NTSC

อย่างไรก็ตามฉันคิดว่ามันเป็นการง่ายที่สุดที่จะแยกทุกเฟรมออกจากนั้นลบเฟรมที่คุณไม่ต้องการ:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

จากนั้นนำสิ่งที่คุณไม่ต้องการออก เนื่องจากเฟรมที่สิบทุกเฟรมจะลงท้ายด้วย a 1.jpgเราจึงสามารถนำกรอบอื่น ๆ ทั้งหมด ...

find . -maxdepth 1 -not -iname "*1.jpg"

... และเมื่อคุณแน่ใจว่าสิ่งเหล่านี้เป็นสิ่งที่คุณต้องการลบ:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

หากคุณสามารถใช้ได้mencoderคุณสามารถลองใช้framestepตัวเลือกดังที่อธิบายไว้ในเอกสารประกอบเช่นframestep=10ในกรณีของคุณ โดยส่วนตัวฉันไม่สามารถติดตั้ง / ลองได้


1
ขอบคุณมากสำหรับความช่วยเหลือและการแก้ไขของคุณ ฉันพยายาม mencoder และแม้กระทั่งว่ามีปัญหา! ฉันเดาว่ามันเกี่ยวข้องกับตัวแปลงสัญญาณหรือคอนเทนเนอร์ ffmpeg แยกเฟรมทั้งหมด 105 เฟรมด้วยคำสั่งด้านล่าง: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg แต่ mencoder จะแยก 90 เฟรมเท่านั้น !!! ด้วยคำสั่งด้านล่าง: mplayer -vo png 1.mov การใช้ framestep = 10 ยังสร้างจำนวนเฟรมที่ไม่ถูกต้อง ฉันตกตะลึงว่าทั้งสาม (ffmpeg, vlc และ mencoder) ไม่สามารถทำงานง่าย ๆ ได้อย่างถูกต้อง ฉันส่งรายงานข้อผิดพลาดไปยังเว็บไซต์ VLC ขอบคุณอีกครั้ง.
wmac

0

หากคุณต้องแปลงวิดีโอเป็นซีรีย์ของรูปภาพ rgb24 หรือ rgb32 ที่เป็นไปได้คุณอาจได้จำนวนเฟรมที่เหมาะสมเนื่องจากในรูปแบบดั้งเดิมดูเหมือนว่าจะมีประเภทเฟรมที่ผิดปกติที่อาจไม่ใช่รูปภาพเลย? ?

ในดิสก์เลเซอร์แบบดั้งเดิมวิดีโอทั้งหมดประกอบด้วยชุดของภาพที่มีหมายเลขเฟรมแต่ละเฟรมตั้งแต่ 1 ถึง 100,000 หรือมากกว่าและเป็นวิธีที่ถูกต้องในการสร้างพื้นฐานสำหรับการแปลงหรือการจัดการในอนาคต

อุตสาหกรรมได้เปลี่ยนแนวคิดการบีบอัดที่แปลกประหลาดนี้เพื่อลดค่าใช้จ่ายและรูปแบบการจัดการตัวเลขทางวิทยาศาสตร์ที่แท้จริง

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

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

FFMPEG อาจใช้บทเรียนจากวิทยาศาสตร์แทนศิลปะเพื่อการจัดการและแสดงภาพที่เหมาะสม หรืออาจจะเป็นอุตสาหกรรม AV ทั้งหมดก็ได้ อุตสาหกรรมต้องการพัฒนาขีดความสามารถของฮาร์ดแวร์และใช้ข้อมูลดิบที่ต้องการหน่วยความจำ / พื้นที่เก็บข้อมูลจำนวนมาก ไม่มีอะไรเต้นข้อมูลดิบเพื่อความแม่นยำและความแม่นยำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.