您的位置:首页 > 编程语言 > C#

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

2015-06-24 19:38 2931 查看
最近需要做一件事,统计一个文件夹下多个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=0
for /f "tokens=1,3 delims= " %%i in (000.txt) do if "%%i"=="Length" set /a a+=%%j
echo 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 off
cd %~dp0
mkdir stat
for %%A in (%1\*.wav) do sox %%A -n stat >  "stat/%%~nxA.txt" 2>&1
countTime  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息