หนึ่งซับ ffmpeg (หรืออื่น ๆ ) เพื่อให้ได้ความละเอียดเท่านั้น?


9

ฉันไม่ค่อยเชี่ยวชาญในบรรทัดคำสั่งดังนั้นหวังว่านี่จะไม่โง่เกินไปสำหรับคำถาม

ถ้าฉันวิ่ง:

ffmpeg -i videofile.avi

ฉันได้รับผลลัพธ์เช่นนี้

ffmpeg version git-2013-11-21-6a7980e Copyright (c) 2000-2013 the FFmpeg develop    ers
  built on Nov 21 2013 12:06:32 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --prefix=/home/user/ffmpeg_build --extra-cflags=-I/home/user/ffmpeg_build/include --extra-ldflags=-L/home/user/ffmpeg_build/lib --b        indir=/home/user/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable    -libfdk-    aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-l    ibx264 --enable-    nonfree
  libavutil      52. 53.100 / 52. 53.100
  libavcodec     55. 44.100 / 55. 44.100
  libavformat    55. 21.100 / 55. 21.100
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 91.100 /  3. 91.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, avi, from 'videofile.avi':
  Metadata:
    encoder         : Lavf52.68.0
  Duration: 00:23:07.68, start: 0.000000, bitrate: 2390 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480     [SAR 1:1 DAR 4:3], 23.98 fps, 23.98 tbr, 23.98 tbn, 1199 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 128 k    b/s

หากฉันสนใจเฉพาะคำสั่งที่ให้ผลลัพธ์ "640x480" ฉันควรทำอย่างไร

ฉันคิดว่าฉันต้องไปป์เอ้าท์พุทและแสดงเป็นนิพจน์ปกติ? ไม่รู้จะทำยังไง ขอบคุณ!

คำตอบ:


10

รับความละเอียดวิดีโอด้วย ffmpeg:

ffmpeg -i filename 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+'

ผลลัพธ์ (เช่น):

640x480

คำตอบของ muru นั้นมากเกินพอ แต่สิ่งนี้ตอบคำถามของฉันตามที่ถาม (เช่นใช้ ffmpeg) ฉันไม่รู้ว่าโปรโตคอลที่นี่คืออะไรด้วยการเลือกคำตอบ ในกรณีนี้ฉันคิดว่าคำตอบของ Muru จะมีประโยชน์มากกว่าในขณะที่ Cyrus ให้ความสำคัญมากกว่า ขออภัยไม่แน่ใจว่าจะไปทางไหน แต่ตอนนี้ฉันเลือก Cyrus 'เนื่องจากเป็นสิ่งที่ฉันขอ (แต่ฉันใช้ Muru's lol)
bcsteeve

1
ระวังให้ดี ตัวอย่างที่แสดงในคำถามจะส่งผลให้ grep สร้างการแข่งขันสองรายการ (ครั้งแรก0x44...และครั้งที่สองเป็นการแก้ไข)
muru

หากอินพุตมีสตรีมวิดีโอหลายรายการเช่นอินพุตจาก DVD คำตอบนี้จะส่งออกwidth x heightวิดีโอต่อสตรีมในหลายบรรทัด สิ่งนี้สามารถหลีกเลี่ยงได้หากต้องการด้วยffprobeหรือโดยการเพิ่มhead -n 1คำสั่งในคำตอบ
llogan

9

การใช้ffprobeจากแพ็คเกจ ffmpeg:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
  1280x720

ดูเอกสารประกอบ ffprobeและเคล็ดลับ FFmpeg Wiki: ffprobeสำหรับข้อมูลเพิ่มเติม


ขอบคุณ ไม่ทราบ ffprobe ช่วยได้มากที่นี่! ขอบคุณทุกคน
bcsteeve

4
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

ทำงานโดยไม่ต้องgreps ใด ๆ

หนึ่งซับดูเหมือนว่า:

exiftool -b metavideo.mp4 -ImageSize

ส่งคืนสตริง WxH ที่คุณต้องการ


เทคนิคนี้ไม่ใช่เทคนิคเดียว
David Foerster

ฉันไม่ได้สังเกตว่ามันเป็นหนึ่งซับที่ร้องขอต่อไปการทำพารามิเตอร์ความกว้างเดียวกัน -ImageSize ส่งคืนสตริง WxH
Alex Dolgov

ดูชื่อคำถามอีกครั้ง! ;-) อย่างไรก็ตาม +1
David Foerster

3

ฉันเห็นเฉพาะตัวอย่างการใช้งานexiftoolและการแยกวิเคราะห์ของเอาต์พุตซึ่งดูเหมือนจะเป็นตัวเลือกที่แปลก exiftoolสามารถนำมาใช้โดยตรงเพื่อรับความละเอียด (และข้อมูลเมตาอื่น ๆ เกือบทั้งหมด):

exiftool -ImageSize -s3 filename

จะส่งผลให้การส่งออกในรูปแบบWIDTHxHEIGHT(EQ: 1280×720)

หมายเหตุ: -s3สั่งให้ exiftool สร้างรูปแบบเอาต์พุตที่สั้นที่สุด (โดยไม่มีชื่อแท็กเครื่องหมายคำพูด ฯลฯ )


2

คุณสามารถทำได้โดยใช้นิพจน์ทั่วไปและffmpegแต่ฉันต้องการใช้exiftoolเป็นส่วนหนึ่งของแพ็คเกจ libimage-exiftool-perlติดตั้ง libimage-exiftool-perl :

$ exiftool some/video.ogv | awk -F' *: *' '$1 == "Image Size"{print $2}'
1242x480

ทำไมexiftool?

  • ffmpeg/ avprobeสาธารณูปโภคพิมพ์เส้นของรูปแบบStream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480ที่หนึ่งหรือมากกว่าค่าของรูปแบบAAAxBBBที่เป็นไปได้ (ตามที่คุณสามารถเห็นในตัวอย่างของคุณ) การกำหนดความละเอียดข้อใดอาจเป็นเรื่องยาก
  • exiftoolบนมืออื่น ๆ Type : Valueที่เอาท์พุทข้อมูลของแบบฟอร์ม Image Sizeดังนั้นจึงเป็นเรื่องง่ายที่จะได้รับข้อมูลที่ถูกต้องคือ นอกจากนี้ยังมีวิธีการระบุฟิลด์ (คั่นด้วยเครื่องหมายโคลอนและช่องว่าง) คุณสามารถแยกค่าได้อย่างง่ายดาย

สิ่งที่awkคำสั่งทำคือ:

  • ตั้งค่าตัวคั่นฟิลด์เป็น' *: *'- เครื่องหมายโคลอนที่:ล้อมรอบด้วยช่องว่างจำนวนเท่าใดก็ได้
  • ตรวจสอบว่าฟิลด์แรก ( $1) คือImage Size
  • และพิมพ์ฟิลด์ที่สอง ( print $2)

รุ่นอื่นจะเป็น:

awk '/^Image Size/{print $4}'
  • โดยค่าเริ่มต้น awk ใช้ช่องว่างในการแยกสาขาดังนั้นImage, Size, :และ1242x480สาขาที่แตกต่างกัน
  • โดยการจับคู่จุดเริ่มต้นของบรรทัด ( ^) กับImage Sizeเราจะได้รับบรรทัดที่ถูกต้อง
  • และเราพิมพ์ข้อมูลที่สี่ (ตั้งแต่Image, Sizeและ:เป็นสามสาขาแรก)

ขอบคุณ! ฉันอาจแนะนำให้คุณแก้ไขตัวอย่างของคุณเพื่อเปลี่ยน "Ubuntu_Free_Culture_Showcase / How \ fast.ogg" เป็นบางสิ่งที่ธรรมดากว่า ตอนแรกฉันใช้มันอย่างแท้จริงเพราะฉันไม่รู้จักว่าเป็นชื่อไฟล์ แน่นอนฉันเห็นข้อผิดพลาดของฉัน 2 วินาทีในภายหลังและวิธีการแก้ปัญหาของคุณใช้งานได้ดี!
bcsteeve

@bcsteeve ฉันใช้เพราะเป็นส่วนหนึ่งของเนื้อหาตัวอย่างที่ติดตั้งในเดสก์ท็อป Ubuntu (ดู/usr/share/example) : D
muru

1

การใช้ความลับเล็กน้อยmediainfoจะดึงความกว้างและความสูงในรูปแบบที่คุณอยู่หลังจากใช้งานซับเดี่ยวแบบง่าย สังเกตตัวอย่างต่อไปนี้บนระบบของฉัน:

andrew@illium~$ mediainfo --Inform="Video;%Width%x%Height%" test.mp4
1920x1080

พารามิเตอร์เพิ่มเติมต่าง ๆ ที่สามารถใช้ในลักษณะนี้สามารถเห็นได้ด้วยmediainfo --Info-Parametersแต่บางทีการใช้งานแบบง่ายด้วยตัวเองจะพอเพียงสำหรับคุณ ...


0

ฉันทำ 1 liner forloop เพื่อแยกความละเอียดจากไดเรกทอรีของไฟล์

for i in $(ls "/root/vidz/dollabillz/"*); do eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "$i"); size=${streams_stream_0_width}x${streams_stream_0_height}; echo $i $size; done;

3
การแยกlsจะไม่จบดี ... การอ้างอิงจะไม่แก้ไขความยุ่งเหยิง
Zanna

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