จะตรวจสอบว่าวิดีโอ (mp4) ใช้เชลล์ได้นานแค่ไหน?


16

ฉันต้อง ftp อัปโหลดไฟล์ mp4 ทั้งหมดในไดเรกทอรีที่มีความยาว> 4 นาทีโดยใช้เชลล์ ฉันไม่พบสคริปต์ใด ๆ เพื่อตรวจสอบระยะเวลาของวิดีโอ ใครบ้างมีความคิดวิธีการทำเช่นนั้น?

ขอบคุณมาก!


1
ดูstackoverflow.com/questions/3844430/นี้:-) หวังว่านี่จะช่วยได้
harish.venkat

คำตอบ:


23

นี่จะทำให้คุณมีความยาวของวิดีโอ

ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//

ใช้ได้กับ URL วิดีโอระยะไกลเช่น ffmpeg -i " instagram.fewr1-1.fna.fbcdn.net/t50.2886-16/… " 2> & 1 | ระยะเวลา ตัด -d '' -f 4 | sed s /, //
skidadon

รูปแบบข้อความบันทึกของ FFmpeg รับประกันหรือไม่? ถ้าไม่ฉันไม่ชอบสิ่งนี้มาก - มันสามารถหยุดทำงานกับการเปิดตัวใด ๆ
Ondra Žižka

7

Mediainfoเป็นเครื่องมือที่รวดเร็วสำหรับจุดประสงค์นี้:

$ mediainfo --Inform="Video;%Duration%"  [inputfile]

คุณสามารถค้นหาตัวเลือกเพิ่มเติมในคำตอบที่ละเอียดมากขึ้น

ในการทดสอบของฉันffprobeใช้เวลา 0.3 วินาทีและmediainfoใช้เวลา 0.09 วินาที


สิ่งนี้ให้ผลลัพธ์แปลก ๆ ... เช่น2679600 ... ดีกว่าที่จะใช้mediainfo --Inform="Video;%Duration/String%" [inputfile]... ซึ่งจะทำให้คุณได้รับบางสิ่งบางอย่างเช่น ike 43 นาที 50s
Robert Riedl

5

คุณสามารถลองใช้คำสั่งavconv ..

ก่อนอื่นคุณควรติดตั้ง:

ติดตั้งผ่านศูนย์ซอฟต์แวร์

หากคุณพิมพ์คำสั่งด้วย flag -i คุณจะได้รับข้อมูลเกี่ยวกับวิดีโอ:

avconv -i test.mp4

ในผลลัพธ์มีฟิลด์ที่เรียกว่าDuration

avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
  built on Nov  6 2012 16:51:33 with gcc 4.6.3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':

  Duration: 00:58:28.05, start: 0.000000, bitrate: 888 kb/s
    Stream #0.0(eng): Video: h264 (High), yuv420p, 720x404, 748 kb/s, 25 fps, 25 tbr, 20k tbn, 50 tbc
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s

ตอนนี้คุณสามารถใช้คำสั่งเพื่อรับค่าของระยะเวลาฟิลด์เท่านั้น

ประเภท:

avconv -i file.mp4 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//

ในกรณีของฉันผลลัพธ์คือ:

00:58:28.05

58 นาทีและ 28.05 วินาที

หวังว่านี่จะเป็นประโยชน์!


1
นอกจากนี้ยังสามารถใช้กับavprobe- ไม่จำเป็นต้องใช้-iแต่ก็ใช้งานได้เหมือนกัน หรือffprobeสำหรับคำตอบของ @ ต่อ
evilsoup

4

exiftool(เดิมทีมีไว้สำหรับการอ่านข้อมูลเมตาของกล้องจากไฟล์ภาพ แต่ขยายในภายหลังเพื่ออ่านและเขียนข้อมูลเมตาจากไฟล์สื่อเกือบทุกชนิด) สะดวกในการใช้งานนี้ รันด้วย:

exiftool FILE.mp4 | grep Duration

คุณอาจต้องติดตั้งexiftoolก่อน แต่สิ่งนี้สามารถทำได้อย่างง่ายดายด้วยคำสั่งต่อไปนี้ (บน Debian และอนุพันธ์เช่น Ubuntu ฯลฯ ):

apt install libimage-exiftool-perl

แน่นอนคำตอบนี้เป็นอีกทางเลือกหนึ่ง อีกหลายคำตอบก็ดีเช่นกัน :)


2

ง่ายยิ่งขึ้น:

avprobe file.mp4 -show_format_entry duration

ขณะนี้ฉันได้รับข้อความ "ตัวเลือก 'show_format_entry' ไม่รองรับให้ใช้ '-show_entries format = duration' แทน"
Faheem Mitha

1

การเพิ่มเพื่อแก้ปัญหาวิธีนี้สามารถใช้กับไดเรกทอรีทั้งหมด:

for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,//  | tr -d "\n" && echo " $f"; done

มันสามารถขยายได้โดย| sortมีไฟล์เรียงตามความยาวของมัน

คุณสามารถเพิ่มสิ่งนี้ไปยัง.bashrcหรือ.bash_aliasesเพื่อที่จะสามารถทำ lsvlength | sortในไดเรกทอรี

alias lsvlength='for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,//  | tr -d "\n" && echo " $f"; done'

1

ffprobeเป็นทางออกที่สง่างามยิ่งกว่าการffmpegพ่นข้อผิดพลาดหากไม่ได้รับพา ธ เอาต์พุต

ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1

0

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

exiftool * | grep ^ Duration | cut -d '' -f 26


1
ไม่จำเป็นต้องใช้grepและเช่น เพียงexiftool -T -Duration *.mkv(หรือรูปแบบไฟล์อะไรก็ได้)
PerlDuck

0

อย่างที่คุณเห็นมีหลายวิธีที่จะทำให้สำเร็จ ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATIONโดยที่mediafileเป็นชื่อไฟล์จะให้ผลลัพธ์คล้ายกับด้านล่าง ช่วงแรกเป็นช่วงเวลาของสตรีมแรก (โดยทั่วไปคือวิดีโอ) และช่วงที่สองเป็นช่วงเวลาของสตรีมที่สอง

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