我需要检查一组音频文件的持续时间.有没有一种简单的方法在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做命令行音频处理.
0xb*_*0de 26
mp3info -p "%m:%02s\n" filename
Run Code Online (Sandbox Code Playgroud)
为您提供指定文件的长度.
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)
除了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)
在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 文件之间的最大/最小持续时间,请随意更改sum为max或min。
可以使用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)
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)
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
ffprobeffprobe your_file.mp3 2>&1 | grep "Duration"
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
持续时间:00:44:33.50,开始:0.011995,比特率:128 kb/