2011-06-04 41 views
4

在我之前的post中,我学会了如何从ffmpeg中提取一个文件的持续时间。如何添加许多值?

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

它将输出类似于00:08:07.98的东西。

我想直到结束是一个脚本,在那里我可以说

get_duration.sh * 

,它将添加所有的时间长度和类似04:108:1107.198输出的东西。

它不必将分钟转换为小时等等。这将是很好,虽然=)

我可以列出

for f in *; do 
    ffmpeg -i "$f" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,; 
done 

所有的长度,但我怎么添加这些奇怪格式的数字?

回答

6

使用以下awk脚本应该很好地工作:

BEGIN { h=0; m=0; s=0; cs=0; } 
/Duration:/ { 
    split($2, time_arr, ":"); 
    h = h + time_arr[1]; 
    m = m + time_arr[2]; 
    split(time_arr[3],time_arr2,"."); 
    s = s + time_arr2[1]; 
    cs = cs + time_arr2[2]; 
    } 
END { 
    s = s + int(cs/100); 
    cs = cs % 100; 
    m = m + int(s/60); 
    s = s % 60; 
    h = h + int(m/60); 
    m = m % 60; 
    printf "%02d:%02d:%02d.%02d\n", h, m, s, cs; 
} 

add_durations.awk将这个,那么你可以做:

for f in *; do ffmpeg -i "$f" 2>&1; done | awk -f add_durations.awk 

注意这也将转换小时等为您提供: )。

+4

小心:我认为你的毫秒值会打印9毫秒为0.9,而不是0.009。 – 2011-06-04 22:07:44

+0

谢谢!希望现在纠正。我愚蠢地误解为“s.ms”而不是百分之一秒。我已经为所有数字添加了零填充,如ffmpeg命令。 – MGwynne 2011-06-05 06:38:49