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

ted*_*uss 37 unix audio sox

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

> duration *
Run Code Online (Sandbox Code Playgroud)

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

ted*_*uss 35

soxi -D filename
soxi -D *
Run Code Online (Sandbox Code Playgroud)

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

  • 是我一个人的问题还是不支持mp3?我收到“soxi 失败格式:没有文件扩展名“mp3”的处理程序”。**编辑**:事实证明我必须`sudo apt-get install libsox-fmt-mp3`。 (2认同)
  • 还有表示小时、分钟和秒的“soxi -d” (2认同)
  • 为了给 sox 添加 mp3 支持,请安装 libsox-fmt-mp3 (2认同)

0xb*_*0de 26

mp3info -p "%m:%02s\n" filename
Run Code Online (Sandbox Code Playgroud)

为您提供指定文件的长度.

  • mp3info -p"%f%m:%s \n"*.mp3也可以 - 将打印文件名和持续时间 (3认同)
  • 所以将其包装在for循环中,就可以将所有文件都设置为* .mp3中的文件;做mp3info -p“%m:%s \ n” $ file; 完成`。祝你们好运。 (2认同)
  • 仅适用于 mp3 文件,不适用于 wav 或 ogg 容器。 (2认同)

Dog*_*gal 12

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

mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3"
Run Code Online (Sandbox Code Playgroud)

要计算本地目录中所有音频的持续时间,这个要点将有助于:

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
Run Code Online (Sandbox Code Playgroud)


Jel*_*Cat 12

ffmpeg -i <audiofile> 2>&1 | grep Duration
Run Code Online (Sandbox Code Playgroud)

  • 您还可以 [使用 ffprobe](/sf/ask/625313741/#56210291) 随附`ffmpeg` 并且是为此而设计的。 (2认同)

Ham*_*ani 9

除了cdosborn的答案.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))}'
Run Code Online (Sandbox Code Playgroud)

在 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))}'
Run Code Online (Sandbox Code Playgroud)

结果是这样的(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
$
Run Code Online (Sandbox Code Playgroud)


cdo*_*orn 8

在OSX上

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

afinfo * | awk '/estimated duration/ { print $3 }'
Run Code Online (Sandbox Code Playgroud)

包括文件路径:

afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'
Run Code Online (Sandbox Code Playgroud)


小智 8

如果您有兴趣使用soxi和 python在目录中查找 wav 文件的总持续时间,您可以使用:

soxi -D input_dir/*.wav | python -c "import sys;print(sum(float(l) for l in sys.stdin))"
Run Code Online (Sandbox Code Playgroud)

input_dir根据您的输入目录更改。如果您想找到所有 wav 文件之间的最大/最小持续时间,请随意更改summaxmin


S. *_*ful 6

可以使用ffprobeffmpeg以高精度获得以秒为单位的原始持续时间,如下所示:

ffprobe -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "filename.mp3" 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

输出,易于在进一步的脚本中使用,格式如下:

193.656236
Run Code Online (Sandbox Code Playgroud)

在此基础上,以下将测量当前目录中所有 .mp3 文件的总持续时间(以秒为单位):

LENGTH=0; for file in *.mp3; do if [ -f "$file" ]; then LENGTH="$LENGTH+$(ffprobe -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file" 2>/dev/null)"; fi; done; echo "$LENGTH" | bc
Run Code Online (Sandbox Code Playgroud)

并且为了测量多个扩展的音频文件的总长度,可以附加另一个通配符:

LENGTH=0; for file in *.mp3 *.ogg; do if [ -f "$file" ]; then LENGTH="$LENGTH+$(ffprobe -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file" 2>/dev/null)"; fi; done; echo "$LENGTH" | bc
Run Code Online (Sandbox Code Playgroud)


JJo*_*oao 5

sox --info -D file             --> duration in seconds
sox --info -d file             --> duration in HH:mm:ss.ss
sox --info file                --> metadata 
Run Code Online (Sandbox Code Playgroud)


Fra*_*urt 5

syssyphus的基于 mplayer from commandlinefu的解决方案 ,可处理音频和视频文件:

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
Run Code Online (Sandbox Code Playgroud)

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

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

输出示例:00:00:37


Mat*_*aun 5

ffprobe

ffprobe your_file.mp3 2>&1 | grep "Duration"
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

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