Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在命令行上检查音频文件的持续时间_Unix_Audio_Sox - Fatal编程技术网

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

Unix 在命令行上检查音频文件的持续时间,unix,audio,sox,Unix,Audio,Sox,我需要检查一组音频文件的持续时间。 有没有一种简单的方法可以在unix命令行上执行此操作 > duration * 我有一个惊人的SoX应用程序,它有一个名为stats的选项,可以生成一组音频信息,包括持续时间。我正在寻找一种方法来获得唯一的持续时间。 我的输出格式灵活,可以是任何样本长度、hh:mm:ss或秒。 我更喜欢后者 mp3info -p "%m:%02s\n" filename 以mm:ss格式提供指定文件的长度(mm可以大于59)。对于文件中的总秒数,您将使用: mp3i

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

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

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 }'

Soxi查询音频文件元数据;D是持续时间选项。它支持全球化。Soxi的老大哥负责命令行音频处理。

mediainfo
将返回音频文件的毫秒数。假设当前目录仅包含音频文件,则

mediainfo --Inform="Audio;%Duration%" "Miley Cyrus - Wrecking Ball.mp3"
要计算本地目录中所有音频的持续时间,将有助于:

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
关于OSX

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

afinfo * | awk '/estimated duration/ { print $3 }'
包括文件路径:

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

mediainfo可以做到这一点,但mediainfo是一个非常有用的工具,它的文档记录非常糟糕,以至于您几乎需要知道如何使用它才能学会如何使用它(在linux世界中经常发生)

经过数小时的测试和读高读低,我终于让它生成一个递归的逗号分隔的文件名列表及其持续时间(毫秒)

将cd复制到起始目录,并发出以下命令:

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

除了cdosborn之外,还可以递归计算当前目录子文件夹中所有
.mp3
文件的长度,并以
天:小时:分钟:秒为单位显示总结果。
格式:

在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秒):

另一个答案包括文件名和持续时间,以小时、分钟和秒为单位

$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
ffmpeg-i2>&1 | grep持续时间

一种基于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

(当您没有
afinfo
可供使用时)我为所有文件递归获取它

# install mp3info if not yet installed with
sudo apt-get install mp3info
使用“查找”命令,将总秒数放入csv文件(首先转到包含mp3文件的目录)

然后在LibreOffice中打开,并在底部汇总(以获得小时数)

具有 输出如下所示:

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


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

ffprobe -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "filename.mp3" 2>/dev/null
易于在后续脚本编写中使用的输出格式如下:

193.656236
在此基础上,以下内容将测量当前目录中所有.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
为了测量多个扩展名的音频文件的总长度,可以附加另一个通配符:

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

如果您对使用和python查找目录中wav文件的总持续时间感兴趣,可以使用以下方法:

soxi -D input_dir/*.wav | python -c "import sys;print(sum(float(l) for l in sys.stdin))"
根据输入目录更改
input\u dir

如果您想找到所有wav文件之间的最大/最小持续时间,请随意将
sum
更改为
max
min
,我在这里扩展了Navid Naderi的答案,并创建了一个bash函数,该函数将为您提供每个文件运行时间的摘要,以及各种格式的一些时间总计(秒、分钟或总运行时间)

输出将如下所示:

00:01:40.97 | subatomicglue - inertialdecay - 01 - hard.wav
00:00:32.00 | subatomicglue - inertialdecay - 02 - acidbass.wav
00:04:50.80 | subatomicglue - inertialdecay - 03 - cause.of.a.new.dark.age.wav
00:02:08.00 | subatomicglue - inertialdecay - 04 - daybreak.falls.wav
00:05:20.75 | subatomicglue - inertialdecay - 05 - forestfloor.wav
00:03:56.32 | subatomicglue - inertialdecay - 06 - rabbithole.wav
00:03:50.40 | subatomicglue - inertialdecay - 07 - feedme.wav
00:06:03.97 | subatomicglue - inertialdecay - 08 - grand.wav
00:02:09.45 | subatomicglue - inertialdecay - 09 - strawberryflavoreddeath.wav
00:04:43.29 | subatomicglue - inertialdecay - 10 - subfloor.wav
00:03:36.96 | subatomicglue - inertialdecay - 11 - silicone.wav
00:04:28.47 | subatomicglue - inertialdecay - 12 - inertial decay.wav
00:01:23.81 | subatomicglue - inertialdecay - 13 - the.void.wav
00:01:18.86 | subatomicglue - inertialdecay - 14 - weet.wav

total sec:    2764.0637880000004
total min:    46.06772980000001
running time: 0:46:04.063788

因此,将其包装在for循环中,即可在*.mp3;do mp3info-p“%m:%s\n”$file;中设置文件的
。祝大家好运。mp3info-p“%f%m:%s\n”*.mp3也可以工作-将打印文件名和持续时间仅适用于mp3文件,不适用于wav或ogg容器。soxi也是我使用的,但不幸的是它缺少m4a支持。它只是我一个人,还是它甚至不支持mp3?我得到了
soxi失败格式:没有文件扩展名“mp3”的处理程序。
。编辑:结果我不得不
su请务必安装libsox-fmt-mp3
。还有
soxi-d
用于数小时、数分钟和数秒。此工具非常棒,也适用于ogg文件,可在debian Repositories中获得。我认为与其他答案相比,此答案需要运行它的机器提供的资源最少。只为我打印一个空行。您还可以t附带了
ffmpeg
,是为此而设计的。
ffprobe -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "filename.mp3" 2>/dev/null
193.656236
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
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
soxi -D input_dir/*.wav | python -c "import sys;print(sum(float(l) for l in sys.stdin))"
function sox_duration_total
{
  if [[ "$#" -lt 1 ]]; then
    echo "find files!"
    echo "  sox_duration_total *.wav"
    echo ""
    return
  fi
  for i in "$@"; do
    val=`soxi -d "$i"`
    echo "$val | $i"
  done
  soxi -D "$@" | python -c "import sys;print(\"\ntotal sec:    \" +str( sum(float(l) for l in sys.stdin)))"
  soxi -D "$@" | python -c "import sys;print(\"total min:    \" +str( sum(float(l) for l in sys.stdin)/60 ))"
  soxi -D "$@" | python -c "import sys;import datetime;print(\"running time: \" +str( datetime.timedelta(seconds=sum(float(l) for l in sys.stdin)) ))"
}
00:01:40.97 | subatomicglue - inertialdecay - 01 - hard.wav
00:00:32.00 | subatomicglue - inertialdecay - 02 - acidbass.wav
00:04:50.80 | subatomicglue - inertialdecay - 03 - cause.of.a.new.dark.age.wav
00:02:08.00 | subatomicglue - inertialdecay - 04 - daybreak.falls.wav
00:05:20.75 | subatomicglue - inertialdecay - 05 - forestfloor.wav
00:03:56.32 | subatomicglue - inertialdecay - 06 - rabbithole.wav
00:03:50.40 | subatomicglue - inertialdecay - 07 - feedme.wav
00:06:03.97 | subatomicglue - inertialdecay - 08 - grand.wav
00:02:09.45 | subatomicglue - inertialdecay - 09 - strawberryflavoreddeath.wav
00:04:43.29 | subatomicglue - inertialdecay - 10 - subfloor.wav
00:03:36.96 | subatomicglue - inertialdecay - 11 - silicone.wav
00:04:28.47 | subatomicglue - inertialdecay - 12 - inertial decay.wav
00:01:23.81 | subatomicglue - inertialdecay - 13 - the.void.wav
00:01:18.86 | subatomicglue - inertialdecay - 14 - weet.wav

total sec:    2764.0637880000004
total min:    46.06772980000001
running time: 0:46:04.063788