检查命令行ffprobe上的音频文件的持续时间

问题描述 投票:33回答:12

我需要检查一组音频文件的持续时间。有没有一种简单的方法在unix命令行上执行此操作?

> duration *

我有一个惊人的SoX应用程序,它有一个名为stats的选项,可以生成一组包含持续时间的音频信息。我正在寻找一种方法来获得持续时间。我对输出格式很灵活,可以是任何样本长度,hh:mm:ss或秒。后者是我的偏好。

unix audio sox
12个回答
24
投票
mp3info -p "%m:%02s\n" filename

mm:ss格式给出指定文件的长度(mm可以大于59)。对于文件中的总秒数,您将使用:

mp3info -p "%S\n" filename

要在几秒钟内获得所有mp3文件的总长度,AWK可以提供帮助:

mp3info -p "%S\n" *.mp3 | awk 'BEGIN { s = 0 }; { s = s + $1 }; END { print s }'

1
投票

mediainfo可以做到这一点,但是mediainfo是那些非常有用的工具之一,你几乎需要知道如何使用它来学习如何使用它(在linux世界中发生了很多)。

经过数小时的试验和高低读数后,我终于得到了一个以逗号分隔的递归文件名列表及其持续时间(以毫秒为单位)。

cd到起始目录并发出以下命令:

find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt

结果将输出到list.txt。


0
投票

(当你没有afinfo可供使用时)我以递归方式得到了我的所有文件

# install mp3info if not yet installed with
sudo apt-get install mp3info

使用find命令,将总秒数放入csv文件(首先转到包含例如mp3文件的目录)

find . -name "*.mp3" -exec mp3info {} -p "%S\r\n" >> totalSeconds.csv \;

然后打开它,例如在LibreOffice中,总结一下(获得时间)

=SUM(A{start}:A{end})/60/60

0
投票

with ffprobe

ffprobe your_file.mp3 2>&1 | grep "Duration"

输出如下所示:

持续时间:00:44:33.50,开始时间:0.011995,比特率:128 kb /


32
投票
soxi -D filename
soxi -D *

Soxi查询音频文件的元数据; D是持续时间选项。它支持globbing。 Soxi的大哥sox做命令行音频处理。


12
投票

mediainfo将返回音频文件的毫秒数。假设当前目录只有音频文件,则如下

mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3"

要计算本地目录中所有音频的持续时间,this gist将帮助:

shopt -s nullglob
let playlist_duration_ms=0
for song_file in *.{mp3,ogg,m4a,flac,wav}; do
  playlist_duration_ms=$(expr $playlist_duration_ms + $(mediainfo --Inform="Audio;%Duration%" "$song_file"))
done
shopt -u nullglob

let playlist_duration_secs=$(expr $playlist_duration_ms / 1000)
let playlist_duration_mins=$(expr $playlist_duration_ms / 60000)
let playlist_duration_remaining_secs=$(expr $playlist_duration_secs - $(expr $playlist_duration_mins \* 60))

echo $playlist_duration_mins minutes, $playlist_duration_remaining_secs seconds

10
投票
ffmpeg -i <audiofile> 2>&1 | grep Duration

8
投票

在OSX上

打印当前目录中每个音频文件的长度:

afinfo * | awk '/estimated duration/ { print $3 }'

包括文件路径:

afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'

4
投票

除了cdosborn的answer之外,还要在当前目录的子文件夹中递归计算所有.mp3文件的长度,并以days:hours:minutes:seconds格式显示总和结果:

在zsh中:

afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'

在bash或sh中:

find . -name "*.mp3" -exec afinfo {} \; | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'

结果是这样的(7天,5小时,6分钟,58秒):

$ afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
7:05:06:58
$

3
投票

基于commandlinefusyssyphus mplayer的解决方案,适用于音频和视频文件:

sudo apt-get install mplayer
find -type f -name "*.mp3" -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1

以H:m:s获取当前目录(及以下)中所有视频/音频的总长度

*.mp3更改为您想要匹配的任何内容(例如,*.avi*.wav),如果要检查所有文件,可以将其完全删除。

输出示例:00:00:37


3
投票
sox --info -D file             --> duration in seconds
sox --info -d file             --> duration in HH:mm:ss.ss
sox --info file                --> metadata 

2
投票

另一个基于soxi的答案,包括文件名和持续时间,小时,分钟和秒格式。

$for f in *amr; do printf "$f "; soxi -d $f; done

DGT20161216.amr 00:22:04.62
DGT20170108.amr 00:28:22.80
DGT20170117.amr 00:20:05.18
© www.soinside.com 2019 - 2024. All rights reserved.