ฉันต้อง ftp อัปโหลดไฟล์ mp4 ทั้งหมดในไดเรกทอรีที่มีความยาว> 4 นาทีโดยใช้เชลล์ ฉันไม่พบสคริปต์ใด ๆ เพื่อตรวจสอบระยะเวลาของวิดีโอ ใครบ้างมีความคิดวิธีการทำเช่นนั้น?
ขอบคุณมาก!
ฉันต้อง ftp อัปโหลดไฟล์ mp4 ทั้งหมดในไดเรกทอรีที่มีความยาว> 4 นาทีโดยใช้เชลล์ ฉันไม่พบสคริปต์ใด ๆ เพื่อตรวจสอบระยะเวลาของวิดีโอ ใครบ้างมีความคิดวิธีการทำเช่นนั้น?
ขอบคุณมาก!
คำตอบ:
นี่จะทำให้คุณมีความยาวของวิดีโอ
ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
Mediainfoเป็นเครื่องมือที่รวดเร็วสำหรับจุดประสงค์นี้:
$ mediainfo --Inform="Video;%Duration%" [inputfile]
คุณสามารถค้นหาตัวเลือกเพิ่มเติมในคำตอบที่ละเอียดมากขึ้น
ในการทดสอบของฉันffprobe
ใช้เวลา 0.3 วินาทีและmediainfo
ใช้เวลา 0.09 วินาที
mediainfo --Inform="Video;%Duration/String%" [inputfile]
... ซึ่งจะทำให้คุณได้รับบางสิ่งบางอย่างเช่น ike 43 นาที 50s
คุณสามารถลองใช้คำสั่ง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 วินาที
หวังว่านี่จะเป็นประโยชน์!
avprobe
- ไม่จำเป็นต้องใช้-i
แต่ก็ใช้งานได้เหมือนกัน หรือffprobe
สำหรับคำตอบของ @ ต่อ
exiftool
(เดิมทีมีไว้สำหรับการอ่านข้อมูลเมตาของกล้องจากไฟล์ภาพ แต่ขยายในภายหลังเพื่ออ่านและเขียนข้อมูลเมตาจากไฟล์สื่อเกือบทุกชนิด) สะดวกในการใช้งานนี้ รันด้วย:
exiftool FILE.mp4 | grep Duration
คุณอาจต้องติดตั้งexiftool
ก่อน แต่สิ่งนี้สามารถทำได้อย่างง่ายดายด้วยคำสั่งต่อไปนี้ (บน Debian และอนุพันธ์เช่น Ubuntu ฯลฯ ):
apt install libimage-exiftool-perl
แน่นอนคำตอบนี้เป็นอีกทางเลือกหนึ่ง อีกหลายคำตอบก็ดีเช่นกัน :)
ง่ายยิ่งขึ้น:
avprobe file.mp4 -show_format_entry duration
การเพิ่มเพื่อแก้ปัญหาวิธีนี้สามารถใช้กับไดเรกทอรีทั้งหมด:
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'
ffprobe
เป็นทางออกที่สง่างามยิ่งกว่าการffmpeg
พ่นข้อผิดพลาดหากไม่ได้รับพา ธ เอาต์พุต
ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1
หากคุณต้องการดูระยะเวลาของวิดีโอบางรายการในไดเรกทอรีคุณสามารถใช้คำสั่งต่อไปนี้
exiftool * | grep ^ Duration | cut -d '' -f 26
grep
และเช่น เพียงexiftool -T -Duration *.mkv
(หรือรูปแบบไฟล์อะไรก็ได้)
อย่างที่คุณเห็นมีหลายวิธีที่จะทำให้สำเร็จ
ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATION
โดยที่mediafileเป็นชื่อไฟล์จะให้ผลลัพธ์คล้ายกับด้านล่าง ช่วงแรกเป็นช่วงเวลาของสตรีมแรก (โดยทั่วไปคือวิดีโอ) และช่วงที่สองเป็นช่วงเวลาของสตรีมที่สอง
DURATION : 00:21:40.132000000
DURATION : 00:21:40.062000000