2012-01-19 110 views
23

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

> duration * 

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

回答

15
mp3info -p "%m:%s\n" filename 

给出了指定文件的长度。

+1

使包裹在一个for循环和你所有的设置,'为* .MP3文件;做mp3info -p“%m:%s \ n”$ file; done'。祝你们好运。 – shellter

+1

mp3info -p“%f%m:%s \ n”* .mp3也可以使用 - 将会打印文件名和持续时间 –

25
soxi -D filename 
soxi -D * 

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

+0

soxi也是我使用的,但不幸的是它缺少m4a支持 – dan3

+0

对于ASF/WMV 。 – galva

7

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 
+0

这个工具非常棒,也适用于ogg文件,可在debian仓库中找到 – quantumbyte

+0

我认为这个答案与其他答案相比,运行它的机器所需的资源最少。 –

+0

只为我打印一个空行。 – JellicleCat

5

在OSX

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

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

包括文件路径:

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

的MediaInfo可以做到这一点,但的MediaInfo是那些是如此糟糕记录,你几乎需要知道如何使用它,以了解如何使用它(有用的工具之一在Linux世界中发生很多)。

经过数小时的试验和读取高低,我终于得到它以毫秒为单位生成递归逗号分隔的文件名列表和它们的持续时间。

CD起始目录,并发出以下命令:

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

结果将输出到LIST.TXT。

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 
$ 
1

另一个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 
0
sox --info -D file    --> duration in seconds 
sox --info -d file    --> duration in HH:mm:ss.ss 
sox --info fils    --> metadata 
1
ffmpeg -i <audiofile> 2>&1 | grep Duration 
0

通过syssyphus基于从​​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中当前的dir(及以下):s:

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

例子:00:00:37

相关问题