如何从ffmpeg输出中提取持续时间?

时间:2011-06-04 20:55:03

标签: linux bash ffmpeg

要获取有关媒体文件的大量信息,可以

ffmpeg -i <filename>

它会输出很多行,特别是

Duration: 00:08:07.98, start: 0.000000, bitrate: 2080 kb/s

我只想输出00:08:07.98,所以我试试

ffmpeg -i file.mp4 | grep Duration| sed 's/Duration: \(.*\), start/\1/g'

但它会打印所有内容,而不仅仅是长度。

即使ffmpeg -i file.mp4 | grep Duration输出所有内容。

如何获得持续时间长度?

13 个答案:

答案 0 :(得分:110)

您可以使用ffprobe

ffprobe -i <file> -show_entries format=duration -v quiet -of csv="p=0"

它将以秒为单位输出持续时间,例如:

154.12

添加-sexagesimal选项会将持续时间输出为小时:分钟:seconds.microseconds

00:02:34.12

答案 1 :(得分:49)

ffmpeg正在将该信息写入stderr,而不是stdout。试试这个:

ffmpeg -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start/\1/g'

请注意stderr重定向到stdout2>&1

修改

您的sed声明也无效。试试这个:

ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,

答案 2 :(得分:11)

根据我的经验,许多工具以某种表/有序结构提供所需数据,并提供参数来收集该数据的特定部分。这适用于例如smartctl,nvidia-smi和ffmpeg / ffprobe也是。简单来说 - 通常不需要管道数据或为这样的任务打开子shell。

因此,我会使用正确的工具 - 在这种情况下,ffprobe将以秒为单位返回原始持续时间值,之后可以自己创建所需的时间格式:

$ ffmpeg --version
ffmpeg version 2.2.3 ...

该命令可能因您使用的版本而异。

#!/usr/bin/env bash
input_file="/path/to/media/file"

# Get raw duration value
ffprobe -v quiet -print_format compact=print_section=0:nokey=1:escape=csv -show_entries format=duration "$input_file"

解释:

  

“ - v quiet”:除了所需的原始数据值外,不输出任何其他内容

     

“ - print_format”:使用特定格式打印数据

     

“compact =”:使用紧凑的输出格式

     

“print_section = 0”:不打印部分名称

     

“:nokey = 1”:不要打印密钥:值对

的密钥      

“:escape = csv”:转义值

     

“ - show_entries format = duration”:在名为format

的部分中获取名为duration的字段的条目

参考:ffprobe man pages

答案 3 :(得分:5)

在一个请求参数的情况下,使用mediainfo及其输出格式是更简单的(持续时间;以毫秒为单位)

amber ~ > mediainfo --Output="General;%Duration%" ~/work/files/testfiles/+h263_aac.avi 
24840

答案 4 :(得分:2)

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

给出输出

HH:MM:SS.milisecs

答案 5 :(得分:2)

我建议使用json格式,它更容易解析

from bs4 import BeautifulSoup
soup = BeautifulSoup(response.body)

metatag = soup.new_tag('link')
metatag.attrs['rel'] = 'stylesheet'
metatag.attrs['type'] = 'text/css'
metatag.attrs['src'] = 'mystyle.css'

soup.head.append(metatag)

您可以在格式部分找到持续时间信息,适用于视频和音频

答案 6 :(得分:1)

最佳解决方案:减少出口确实可以得到 00:05:03.22

ffmpeg -i input 2>&1 | grep Duration | cut -c 13-23

答案 7 :(得分:0)

对于那些想要在Windows中执行相同计算但没有其他软件的人,这里是命令行脚本的脚本:

set input=video.ts

ffmpeg -i "%input%" 2> output.tmp

rem search "  Duration: HH:MM:SS.mm, start: NNNN.NNNN, bitrate: xxxx kb/s"
for /F "tokens=1,2,3,4,5,6 delims=:., " %%i in (output.tmp) do (
    if "%%i"=="Duration" call :calcLength %%j %%k %%l %%m
)
goto :EOF

:calcLength
set /A s=%3
set /A s=s+%2*60
set /A s=s+%1*60*60
set /A VIDEO_LENGTH_S = s
set /A VIDEO_LENGTH_MS = s*1000 + %4
echo Video duration %1:%2:%3.%4 = %VIDEO_LENGTH_MS%ms = %VIDEO_LENGTH_S%s

此处发布的答案相同:How to crop last N seconds from a TS video

答案 8 :(得分:0)

如果您要使用ffmpeg 使用python脚本从媒体文件中检索长度(以及所有其他元数据),则可以尝试以下操作:

.numpy()

输出:

import subprocess
import json

input_file  = "< path to your input file here >"

metadata = subprocess.check_output(f"ffprobe -i {input_file} -v quiet -print_format json -show_format -hide_banner".split(" "))

metadata = json.loads(metadata)
print(f"Length of file is: {float(length["format"]["duration"])}")
print(metadata)

答案 9 :(得分:-1)

我会在C ++中用文本文件执行此操作并提取标记。为什么?我不像其他人一样是linux终端专家。
要设置它,我会在Linux中执行此操作。

ffmpeg -i 2>&1 | grep "" > mytext.txt

然后运行一些C ++应用程序来获取所需的数据。也许提取所有重要的值并重新格式化以便使用令牌进行进一步处理。 我只需要处理我自己的解决方案,人们就会取笑我,因为我是一个Linux新手,我不喜欢脚本太多。

答案 10 :(得分:-1)

哎呀。算了。看起来我必须从我的C和C ++编程中获取蜘蛛网并使用它。我不知道所有的shell技巧让它工作。 这是我得到了多远。

ffmpeg -i myfile 2>&1 | grep "" > textdump.txt

然后我可能会用C ++应用程序提取持续时间,而不是提取标记。

我没有发布解决方案,因为我现在不是一个好人

更新 - 我有办法获取持续时间时间戳

步骤1 - 将媒体信息发送到文本文件
`ffprobe -i myfile 2>&1 | grep "" > textdump.txt`

`ffprobe -i myfile 2>&1 | awk '{ print }' > textdump.txt`

第2步 - 回顾所需信息并将其解压缩
cat textdump.txt | grep "Duration" | awk '{ print $2 }' | ./a.out
注意a.out。这是我的C代码,用于删除生成的逗号,因为输出类似于00:00:01.33,
这是获取stdin并输出所需信息的C代码。我不得不采取更大,更少的迹象来观看。

cat textdump.txt | grep "Duration" | awk '{ print $2 }' | ./a.out

现在输出格式正确如00:00:01.33

答案 11 :(得分:-4)

你可以试试这个:

/*
* Determine video duration with ffmpeg
* ffmpeg should be installed on your server.
*/
function mbmGetFLVDuration($file){

  //$time = 00:00:00.000 format
  $time =  exec("ffmpeg -i ".$file." 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//");

  $duration = explode(":",$time);
  $duration_in_seconds = $duration[0]*3600 + $duration[1]*60+ round($duration[2]);

  return $duration_in_seconds;

}

$duration = mbmGetFLVDuration('/home/username/webdir/video/file.mov');
echo $duration;

答案 12 :(得分:-5)

fvmpeg已被avconv取代:只需将avconb替换为Louis Marascio的答案。

avconv -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start.*/\1/g'

注意:aditional。*开始后独自获得时间!!