zoukankan      html  css  js  c++  java
  • 分享python分析wave, pcm音频文件

    最近研究的,我用的是python3.3, 用matplotlib画图,

    下面代码演示分析pcm文件,如果是wave文件,把wave的文件头(前44字节)去掉就是pcm文件了。

    代码如下

     1 # -*- coding:utf-8 -*-
     2 
     3 import array
     4 import os
     5 from matplotlib import pyplot
     6 
     7 fileName = 'e:/music/qianqian.pcm' # 2 channel, 16 bit per sample
     8 file = open(fileName, 'rb')
     9 base = 1 / (1<<15)
    10 
    11 shortArray = array.array('h') # int16
    12 size = int(os.path.getsize(fileName) / shortArray.itemsize)
    13 count = int(size / 2)
    14 shortArray.fromfile(file, size) # faster than struct.unpack
    15 file.close()
    16 leftChannel = shortArray[::2]
    17 rightChannel = shortArray[1::2]
    18 
    19 def showPCM(leftChannel, rightChannel, start = 0, end = 5000):
    20     fig = pyplot.figure(1)
    21 
    22     pyplot.subplot(211)
    23     pyplot.title('pcm left channel [{0}-{1}] max[{2}]'.format(start, end, count))
    24     pyplot.plot(range(start, end), leftChannel[start:end])
    25 
    26     pyplot.subplot(212)
    27     pyplot.title('pcm right channel [{0}-{1}] max[{2}]'.format(start, end, count))
    28     pyplot.plot(range(start, end), rightChannel[start:end])
    29 
    30     pyplot.show()
    31     # fig.savefig('pcm.pdf') # save figure to pdf file
    32 
    33 showPCM(leftChannel, rightChannel, 0, count)

    另一种分析方法,用struct.unpack,但读取要比上一种慢很多

     1 # -*- coding:utf-8 -*-
     2 
     3 import struct
     4 from matplotlib import pyplot
     5 
     6 file = open('e:/music/qianqian.pcm', 'rb') # if file is too large, pyplot may overflow
     7 count = 0
     8 total = 0
     9 base = 1 / (1<<15)
    10 maxl = 0
    11 minl = 0
    12 maxr = 0
    13 minr = 0
    14 larray = []
    15 rarray = []
    16 # file has two channels, 16 bit per sample
    17 while True:
    18     lr = file.read(4)
    19     if len(lr) < 4:
    20         break
    21     count += 1
    22     lvalue = struct.unpack('h', lr[:2])[0] * base
    23     larray.append(lvalue)
    24     if lvalue > maxl:
    25         maxl = lvalue
    26     if lvalue < minl:
    27         minl = lvalue
    28     total += lvalue
    29     rvalue = struct.unpack('h', lr[2:])[0] * base
    30     rarray.append(rvalue)
    31     if rvalue > maxr:
    32         maxr = rvalue
    33     if rvalue < minr:
    34         minr = rvalue
    35 
    36 file.close()
    37 avarage = total / count
    38 print(count, total, avarage)
    39 print('max = {0} min = {1}'.format(maxl, minl))
    40 
    41 fig = pyplot.figure(1)
    42 pyplot.subplot(211)
    43 pyplot.title('pcm left channel')
    44 pyplot.plot(range(count), larray)
    45 pyplot.subplot(212)
    46 pyplot.title('pcm right channel')
    47 pyplot.plot(range(count), rarray)
    48 pyplot.show()
    49 # fig.savefig('pcm.pdf')

     代码及pcm下载:

    链接:https://pan.baidu.com/s/1lTn7o2kpwKzd1tFiIDfIdQ
    提取码:oqgz

    下面这个地址也有一个例子:http://stackoverflow.com/questions/18625085/how-to-plot-a-wav-file可以看看。

  • 相关阅读:
    python库--pandas--文本文件读取
    python库--flashtext--大规模数据清洗利器
    PyCharm--帮助文档
    Git--命令
    symfony doctrine generate entity repository
    [转]MySQL性能优化的最佳20+条经验
    svn使用
    一致性hash
    JavaScript学习笔记 1
    curl发出请求
  • 原文地址:https://www.cnblogs.com/Yinkaisheng/p/3753124.html
Copyright © 2011-2022 走看看