ฉันจะรับความยาวของไฟล์วิดีโอจากคอนโซลได้อย่างไร


24

สมมติว่าเรามีไฟล์วิดีโอ some_video

ฉันจะได้รับความยาวจากเชลล์สคริปต์ (ด้วย mplayer / transcode / gstreamer / vlc / ffmpeg / อะไรก็ตาม)

VIDEO_LENGTH_IN_SECONDS=`ffmpeg .... -i some_video ... | grep -o .....`

คำตอบ:


33
ffprobe -i some_video -show_entries format=duration -v quiet -of csv="p=0"

จะคืนค่าระยะเวลาวิดีโอเป็นวินาที


ไม่ทราบเกี่ยวกับffprobeขอบคุณ!
ckujau

21

สิ่งที่คล้ายกับ:

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

สิ่งนี้จะส่งมอบ: HH:MM:SS.ms. คุณยังสามารถใช้ffprobeซึ่งมาพร้อมกับการติดตั้ง FFmpeg ส่วนใหญ่:

ffprobe -show_format input | sed -n '/duration/s/.*=//p'

… หรือ:

ffprobe -show_format input | grep duration | sed 's/.*=//')

ในการแปลงเป็นวินาที (และเก็บมิลลิวินาที) ให้ไพพ์เป็น:

awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }'

หากต้องการแปลงเป็นมิลลิวินาทีให้แปลงเป็น:

awk '{ split($1, A, ":"); print 3600000*A[1] + 60000*A[2] + 1000*A[3] }'

หากคุณต้องการเพียงไม่กี่วินาทีโดยไม่มีมิลลิวินาทีให้ไพพ์ลงใน:

awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'

ตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่


tcprobe ยังได้รับการออกแบบมาสำหรับมัน แต่มันทำงานได้ไม่ดีในระบบของฉัน
วิ

1
... การแก้ไขของฉันถูกปฏิเสธดังนั้นฉันจะโพสต์ที่นี่ว่าขั้นตอนแรกสามารถทำได้โดยรัดกุมยิ่งขึ้นffprobeซึ่งเป็นเครื่องมือที่ออกแบบมาเพื่อจุดประสงค์เหล่านี้ซึ่งบรรจุด้วยffmpeg: ffprobe -show_format input | sed -n '/duration/s/.*=//p'(หรือffprobe -show_format input | grep duration | sed 's/.*=//') อาจ @slhck สามารถแก้ไขตรงนี้เป็นคำตอบ
evilsoup

ขออภัยเกี่ยวกับสิ่งนั้น @evilsoup บางทีฉันควรปฏิเสธว่าคุณและ LordNeckbeard ได้รับอนุญาตให้แก้ไขโพสต์ของฉันได้อย่างอิสระ - ฉันเคยมีปัญหานี้มาแล้วสองสามครั้ง ครั้งต่อไปเพียงแค่เพิ่มบันทึกเล็ก ๆ น้อย ๆ กับข้อความแก้ไขหรือดังนั้น :)
slhck

0

ในกรณีที่คุณไม่ได้มีการเข้าถึงคุณสามารถใช้ffprobemediainfo

# Outputs a decimal number in seconds
mediainfo some_video --Output=JSON | jq '.media.track[0].Duration' | tr -d '"'`

1
ขจัดความจำเป็นในการjqและtr:mediainfo --Output="General;%Duration/String%" input
llogan

เรียบร้อย! ฉันจะออกจากคำตอบของฉันตัดต่อสำหรับในตอนนี้เพราะผลลัพธ์ของคำสั่งของคุณจะอยู่ในรูปเมื่อเทียบกับX s YYY ms X.YYYปรับเปลี่ยนได้ง่ายพอ| sed -e 's/ s /./' -e 's/ ms//'หากคุณต้องการใช้เส้นทางนั้นและไม่สามารถเข้าถึงjqได้
แทนที่

ที่สามารถเปลี่ยนแปลงได้ด้วยmediainfo --Output="General;%Duration/String3%" inputการส่งออกแทน00:01:48.501 1 min 48 s
llogan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.