最近在处理wav相关文件,碰见一工具产生的ualw文件不带header,顺手用python给wav格式文件加头处理,让普通播放器也能播放。

(原文:http://www.cnblogs.com/ryhan/p/6854348.html)

#! /usr/bin/env python
# coding=utf-8 __author__ = 'ryhan' # 以下代码解决输出乱码问题
import sys
import os
import struct # print sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding('utf-8') # print sys.getdefaultencoding() class WaveOps(object):
def __init__(self):
pass @staticmethod
def add_ulaw_header(s_flie, t_file):
"""
文件加头
:param wavfile:
:return:
""" # 文件检测
if not s_flie or not os.path.exists(s_flie):
return False, 's_flie not exists !' # 文件头
if os.path.exists(t_file):
with open(t_file, 'rb') as fin:
riff_flag = fin.read(4)
if riff_flag == 'RIFF':
return False, 't_file already has header with RIFF !'
# riff_flag, = struct.unpack('4s', fin.read(4)) with open(s_flie, 'rb') as fin:
with open(t_file, 'wb') as fout:
# fin.seek(0, os.SEEK_SET)
start_pos = fin.tell()
fin.seek(0, os.SEEK_END)
end_pos = fin.tell()
ulaw_header = WaveOps.create_ulaw_header(end_pos - start_pos)
fout.write(ulaw_header)
fin.seek(os.SEEK_SET)
fout.write(fin.read()) if not os.path.exists(t_file):
return False, 't_file not create success !' with open(t_file, 'rb') as ftag:
riff_flag = ftag.read(4)
print riff_flag
if riff_flag == 'RIFF': return True, 'add header success !'
else:
return False, 'add header failure ! but t_file has created ~ ! ' @staticmethod
def create_ulaw_header(audio_size, sampleRate=8000, bits=8, channel=1):
"""
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文件总长-8 long int size0=文总长-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 12000000H(ULAW) long int size1=0x12
14H 2 int 07 00H int fmttag=0x07
16H 2 int 声道数 int channel=1 或2
18H 4 long int 采样率 long int samplespersec
1CH 4 long int 每秒播放字节数 long int bytepersec
20H 2 int 采样一次占字节数 int blockalign=0x01
22H 4 long int 量化数 long int bitpersamples=8
26H 4 char "fact" char wave_fact="fact"
2AH 8 char 0400000000530700H定 char temp
32H 4 char "data" char wave_data="data"
36H 4 long int 采样数据字节数 lont int size2=文长-58
""" header = ''
# 00H 4 char "RIFF" char riff_id[4]="RIFF"
header += struct.pack('4c', 'R', 'I', 'F', 'F')
# 04H 4 long int 文件总长-8 long int size0=文总长-8
header += struct.pack('i', audio_size + 58 - 8)
# 08H 8 char "WAVEfmt " char wave_fmt[8]
header += struct.pack('8c', 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ')
# 10H 4 long int 12000000H(ULAW) long int size1=0x12
header += '\x12\x00\x00\x00'
# 14H 2 int 07 00H int fmttag=0x07
header += '\x07\x00'
# 16H 2 int 声道数 int channel=1 或2
header += struct.pack('H', channel)
# 18H 4 long int 采样率 long int samplespersec
header += struct.pack('i', sampleRate)
# 1CH 4 long int 每秒播放字节数 long int bytepersec
header += struct.pack('i', sampleRate * bits / 8)
# 20H 2 int 采样一次占字节数 int blockalign=0x01
header += struct.pack('H', channel * bits / 8)
# 22H 4 long int 量化数 long int bitpersamples=8
header += struct.pack('i', bits)
# 26H 4 char "fact" char wave_fact="fact"
# rHeadInfo += struct.pack('4c', 'f', 'a', 'c', 't')
# 2AH 8 char 0400000000530700H定 char temp
# rHeadInfo += struct.pack('8c', 'c', 'h', 'a', 'r', 't', 'e', 'm', 'p')
# 32H 4 char "data" char wave_data="data"
header += struct.pack('4c', 'd', 'a', 't', 'a')
# 36H 4 long int 采样数据字节数 lont int size2=文长-58
header += struct.pack('i', audio_size)
return header if __name__ == '__main__':
print WaveOps.add_ulaw_header('wav/2-raw.wav', 'wav/2-new.wav')

相关代码文件下载:files.cnblogs.com/files/ryhan/WavOps.zip

纯Python给ulaw wav文件加头的更多相关文章

  1. 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012

    本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...

  2. 给pcm格式文件加wav文件头

    #include <stdlib.h>#include <stdio.h>#include <string.h>void main(){ //wav头的结构如下所示 ...

  3. Python解析Wav文件并绘制波形的方法

    资源下载 #本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在 ...

  4. Python 通过 .cube LUT 文件对图像加滤镜

    Python 通过 .cube LUT 文件对图像加滤镜 一个好用的python给图片加滤镜的代码: https://github.com/CKboss/PyApplyLUT 这个是对C++代码的封装 ...

  5. Python 读取WAV文件并绘制波形图

    aa Python 读取WAV文件并绘制波形图 ffmpeg -i test_pcm_mulaw.wav -f wav -codec:a pcm_s16le -ar 8000 -ac 1 out.wa ...

  6. 1.svn 彻底clear时,注意代码备份 2.借助vc助手加头文件

    1.svn 彻底clear时,注意代码备份 2.不小心彻底clear可以在回收站找到 3.借助vc助手加头文件

  7. 用 Python 简单生成 WAV 波形声音文件

    Python 简单生成 WAV 波形声音文件 让机器发出声响,本身就是一件充满魔法的事情.有没有想过,用一段简单的代码,生成一个最简单的声音呢?Python 这门脚本语言的库十分丰富,借助于其中的三个 ...

  8. python 播放 wav 文件

    未使用其他库, 只是使用 pywin32 调用系统底层 API 播放 wav 文件. # Our raison d'etre - playing sounds import pywintypes im ...

  9. 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

    本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的co ...

随机推荐

  1. 深入理解java虚拟机(九)类加载器以及双亲委派模型

    虚拟机把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器”. 类与类加载器 任 ...

  2. Django进阶(转载)

    Django进阶地址 来自为知笔记(Wiz)

  3. java外观模式

    外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...

  4. 把windows电脑变成路由器使用

    实用小技巧1 把windows电脑变成路由器使用 适用对象: windows7.windows8的笔记本电脑或者有无线网卡的台式电脑 网络要求: CMCC-EDU和家里拨号上网的都可以,但是电信的校园 ...

  5. 慎用uniapp开发商业级应用

    官方的社区反馈问题只给解决简单的前端问题,涉及到IDE的问题长期没人回复没人认领 官方公布的各渠道联系方式都得不到回复,先后出现了两个无法解决的问题 第一个问题(现在你都可以去他们社区搜索,没人回复没 ...

  6. FTP ftp部署遇到问题

    FTP  ftp部署遇到问题 一. 二.

  7. 《Beginning Java 7》 - 2 - Cloning 克隆

    Cloning 分两类:影子克隆 shallow cloning 深度克隆 deep cloning * 调用 clone() 需要 implments Cloneable.此函数为 protecte ...

  8. Python扫描邮件主题,并打印

    import imaplib import email from email.header import decode_header import datetime if __name__ == '_ ...

  9. Delphi编程中使用回车键不换行处理方法!!

    我以前遇到过Delphi编程中使用回车键不换行的问题,一直没有找到正确处理方法,以至于每次都重新安装Delphi,今天在XE8中再次遇到这样问题,万幸找到了正确的解决方法: 可能使用过程中不小心按了i ...

  10. 深入了解java虚拟机(JVM) 第五章 如何判断对象为垃圾对象

    本章开始学习垃圾回收的过程,垃圾回收的过程首先就是要确定对象是否是垃圾对象,如果是垃圾对象,垃圾回收器才会进行回收.垃圾回收主要又两种算法:引用计数算法和可达性分析算法. 一.引用计数算法 引用计数算 ...