统计音频文件总时长

统计音频文件总时长

两种实现方法,调用sox工具,调用python wave库。

sox

命令行中键入sox wavfile -n stat

-bash-4.2$ sox arctic_a0001.wav -n stat
Samples read:             53680
Length (seconds):      3.355000
Scaled by:         2147483647.0
Maximum amplitude:     0.628510
Minimum amplitude:    -0.649933
Midline amplitude:    -0.010712
Mean    norm:          0.069802
Mean    amplitude:    -0.000027
RMS     amplitude:     0.114387
Maximum delta:         0.332764
Minimum delta:         0.000000
Mean    delta:         0.019452
RMS     delta:         0.033908
Rough   frequency:          754
Volume adjustment:        1.539

其中的length就是长度,单位seconds。

Code

import os,sys
import os,sys
import math
import subprocess
import csv

wavdir = ‘wav‘
txtdir = ‘txt‘
wavlst = os.listdir(wavdir)
total = 0
def get_wav_duration(wav_id):
    cmd = "sox {} -n stat 2>&1".format(os.path.join(wavdir,wav_id))
    tmp = os.popen(cmd)
    dur_line = tmp.readlines()[1].split()
    dur = math.floor(float(dur_line[2]) * 10)/10
    #print dur
    global total
    total = total + dur
    return str(dur)

with open(‘text.csv‘,‘wb‘) as csvfile:
    writer = csv.writer(csvfile)
    for wav_id in wavlst:
        utt_id = wav_id.split(‘.‘)[0]
        duration = get_wav_duration(wav_id)
        #sound_nframe = os.path.join(wavdir, utt_id)
        write_tmp = [utt_id, duration]
        writer.writerow(write_tmp)
print(total)

os.popen简记

python中调用外部命令行命令,主要使用os.system(cmd)os.popen(cmd),两个命令的区别在于前者返回cmd退出状态码,后者能够返回脚本执行过程中的输出内容。在python的document中貌似并不推荐os.popen,推荐使用subprocess.popen,用法稍微复杂。

os.system

#!/bin/bash
echo "hello world!"
exit 3
os.system(cmd):返回16bit,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码(即高位信号有用)
>>> n = os.system(test.sh)
>>> n >> 8
>>> 3

os.popen

这种调用方式是通过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容),如果需要其他的内容,就需要使用重定向2>&1【注意重定向】

import os
cmd = ‘echo haha‘
tmp = os.popen(cmd).readlines()
print(tmp)

wave lib

统计The World English Bible中语音的时长,12G的文件,两层文件夹,统计后总时长为263965.387755s(约73h)

import os
import wave
import contextlib
def get_wav_duration(fname, print_flag=0):
    with contextlib.closing(wave.open(fname,‘r‘)) as f:
        frames = f.getnframes()
        rate = f.getframerate()
        wav_duration = frames / float(rate)
        if str(print_flag) != ‘0‘:
            print(‘wav time: {}‘.format(wav_duration))
        return wav_duration

wavdirdir = ‘WEB‘
wavdirlst = os.listdir(wavdirdir)
wavlst = []
for lst in wavdirlst:
    wavdir = os.path.join(wavdirdir,lst)
    wavpath = os.listdir(wavdir)
    for wav in wavpath:
        wavlst.append(os.path.join(wavdir,wav))
total = 0
for lst in wavlst:
    total += get_wav_duration(lst)
print(total)

Reference

http://blog.csdn.net/yogurt0928/article/details/46625731

https://taizilongxu.gitbooks.io/stackoverflow-about-python/content/6/README.html

http://blog.csdn.net/windone0109/article/details/8895875

https://www.cnblogs.com/bluescorpio/archive/2010/05/04/1727020.html

http://blog.csdn.net/y_xianjun/article/details/73245482

时间: 2024-07-31 09:35:14

统计音频文件总时长的相关文章

java获取音频文件播放时长

方法一: 在项目开发过程中,需要获取音视频文件时长.查询资料后发现 JAVE能够完美得到想要的结果,JAVE项目简介如下: The JAVE (Java Audio Video Encoder) library is Java wrapper on the ffmpeg project. Developers can take take advantage of JAVE to transcode audio and video files from a format to another. I

统计指定目录下所有mp4文件的时长(包含子目录下的文件)

1 # -*- coding:utf-8 -*- 2 # Author :Zcb 3 4 import os 5 from moviepy.editor import VideoFileClip 6 7 file_Dir = u"e:\\test" #加个u 是表示unicode 一般用在中文字符前 8 sum_time =0 9 10 class FileCheck(): 11 def __init__(self): 12 self.file_dir = file_Dir 13 14

ffmpeg获取文件的总时长(mp3/mp4/flv等)

使用ffmpeg.exe获取文件属性信息,C#中可以在进程外异步调用这个工具,如下: using (System.Diagnostics.Process pro = new System.Diagnostics.Process()) { pro.StartInfo.UseShellExecute = false; pro.StartInfo.ErrorDialog = false; pro.StartInfo.RedirectStandardError = true; pro.StartInfo

java切割音频文件

工具: 一个jar包即可:jave-1.0.2.jar 可以切割wav格式的音频文件 完整工程目录 就一个jar包,一个main类 代码: package com.zit; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import it.sauronsoftw

PHP获取音频mp3文件时长或音频文件其它参数属性

今天在开发项目中遇到一个问题,要获取到上传音频的时长,从而展示在前端页面 最后找到解决方案: 1.首先,我们需要先下载一份PHP类-getid3  https://codeload.github.com/JamesHeinrich/getID3/zip/master 2.解压文件,把整个文件夹上传到服务器 3.贴代码 include_once 'getid3/getid3.php'; //引入该文件 $getID3 = new getID3(); //实例化类 $ThisFileInfo = @

shell解压压缩包,求包下所有文本的录音时长总和

#!/bin/bash#from为压缩包批次所在目录#basetarpath 为统计每批次总时长from=$1basetarpath=$2suffix="tgz"todir=$basetarpathoutdir=$basetarpath/home/iflytek/outif [ ! -d? $from ]; thenexitfiif [ ! -d $basetarpath ];thenmkdir -p $basetarpathfifunction jieya(){ ? ? for el

scala实战之spark用户在线时长和登录次数统计实例

接触spark后就开始学习scala语言了,因为有一点python和java的基础学习起来还行,今天在这里把我工作中应用scala编程统计分析用户行为日志的实例和大家分析一下,我这里主要讲一下用户的在线时长统计和登录次数统计算法实现过程. 第一步 编程环境:首先你得有spark安装包 你可以先不用本地安装spark,但是可以通过import spark-assembly-1.6.2-hadoop2.6.0.jar包来完成程序调试 另外需要scala的运行环境,我用的版本:scala-sdk-2.

统计指定目录下的视频时长

有时间可以写成递归的 1 package org.zln.video.demo1; 2 3 import it.sauronsoftware.jave.Encoder; 4 import it.sauronsoftware.jave.EncoderException; 5 import it.sauronsoftware.jave.InputFormatException; 6 import it.sauronsoftware.jave.MultimediaInfo; 7 8 import ja

DirectX 因素:在 Windows 8 中流式载入和处理音频文件

Charles Petzold 下载代码示例 如今,许多 Windows 用户的硬盘中都有一个音乐库,其中包含多达数千甚至上万个 MP3 和 WMA 文件. 若要在电脑上播放此音乐,这类用户一般运行 Windows Media Player 或 Windows 8 Music 应用程序. 但对于程序员来说,知道我们可以编写自己的程序来播放这些文件再好不过了. Windows 8 提供编程接口,用来访问音乐库,获取各个音乐文件的信息(如艺术家.标题和播放时长)以及用 MediaElement 播放