统计多个wav文件的总音频时长

来源:互联网 发布:经济数据先行指标 编辑:程序博客网 时间:2024/04/27 17:50

最近需要做一件事,统计一个文件夹下多个wav文件的总音频文件。

应该有多种途径,我这里就只说我的做法。

主要工作分成了两步:1.提取单个文件的音频时长信息   2.累加音频时长

1.提取单个文件的音频时长信息

这里我用到了一个叫做sox的音频处理工具,下载地址:

https://sourceforge.net/projects/sox/files/sox/14.4.1/

其中有一种用法为:

sox wavFile -n stat

这个命令可以得到wavFile这个音频文件的相关信息如下:


可以看到其中有一行Length (seconds): 3.690000

这一行就是所需要的该wav文件的时长。

我这里用的批处理方式如下:

for %%A in (%1\*.wav) do sox %%A -n stat >  "stat/%%~nxA.txt" 2>&1
%1表示的是传入的wav文件夹的路径,也就是对wav文件夹下所有的wav文件执行上述的sox操作并将每个文件对应的输出的信息保存在stat这个文件夹下。

2.累加音频时长

这一部分在累加之前还要先把单个的音频信息提取出来,因为上一步的做法只是得到了一个信息文件,还需要从中找出所需要的那一个值。

原本想同样通过批处理的方式处理得到:

set a=0for /f "tokens=1,3 delims= " %%i in (000.txt) do if "%%i"=="Length" set /a a+=%%jecho totoal=%a%

然而这个做法却会得到missing operator的错误提示,原因在于bat不能处理小数...

于是最后还是写了个C#小程序来完成这一步的信息提取和累加。主要代码如下:

            string statPath = "";            if (args.Length != 1)            {                System.Console.WriteLine("Please use the path of stat directory as the only parameter.");                Environment.Exit(0);            }            else            {                 statPath = args[0];            }                 string dir = Environment.CurrentDirectory.Substring(0, Environment.CurrentDirectory.LastIndexOf("\\"));                        string[] statFile = Directory.GetFiles(statPath);            //StreamReader sr = new StreamReader(dir + "\\000.txt");            double dirTime = 0.0;            string line = "";                        foreach (string fileName in statFile)            {                StreamReader sr = new StreamReader(fileName);                  while(!sr.EndOfStream)                {                    line = sr.ReadLine();                    string[] token = line.Split(' ');                    if (token.Length > 2)                        if (token[0] == "Length")                            dirTime += Convert.ToDouble(token[token.Length-1]);                }                sr.Close();            }            System.Console.WriteLine(dirTime);

这个程序的调用形式如下:

countTime.exe statPath
于是最后的批处理文件形式如下:

@echo offcd %~dp0mkdir statfor %%A in (%1\*.wav) do sox %%A -n stat >  "stat/%%~nxA.txt" 2>&1countTime  stat



另外再附几个也许有用的链接,但是没有验证过仅供参考:

1.查看/导出某文件夹内影音文件的时长、大小、帧率、码率等统计信息(批处理)

http://outofmemory.cn/code-snippet/2951/look-daochu-mou-file-jia-nei-yingyin-file-shichang-%E3%80%81-size-%E3%80%81-zhenglv-%E3%80%81-malv-kind-calculation-informat

2.C#获取音频文件(MP3等)播放时间长度的几种方式

http://blog.csdn.net/rabbitsoft_1987/article/details/19039201

3.windows批处理(cmd/bat)编程详解(这篇博文感觉讲解挺不错)

http://blog.csdn.net/bingjie1217/article/details/12947327

4.BAT CMD批处理文件脚本总结

http://www.cnblogs.com/linglizeng/archive/2010/01/29/Bat-CMD-ChineseVerion.html

5.dos命令行或批处理中变量一个百分号和两个百分号的区别

http://blog.csdn.net/aolia2000/article/details/6885907

6.批处理的命令行参数传递

http://blog.csdn.net/yunnying/article/details/12010779


0 0