最近在处理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. github注册流程

  2. ManualResetEvent 线程通信

    using System; using System.Threading; namespace ConsoleApp1 { class MyThread { Thread t = null; Manu ...

  3. 一文读懂加固apk的开发者是怎么想的

    有人说加固会明显拖慢启动速度,同时造成运行卡顿,严重降低用户体验,而且加固是完全可以脱壳的,只需要pc配合进行断点调试就能抓到解密后的dex文件,加固并没有所说的那么安全. 但是为什么还有一大批开发者 ...

  4. GPU大百科全书 第二章 凝固生命的光栅化

    光栅化——死神来了……   前言:在上一期的GPU大百科全书里,我们目睹了可爱的香草从抽象世界走向现实,从方程还原成实体的全过程.可以说香草活了,因为几何单元,我们赋予了她完整的灵魂. 如果你正在为G ...

  5. python字符串的切片

    # 字符串的切片 """ (5)字符串的切片 :切片就是截取字符串的意思 (1)语法 =>字符串[::] 完整格式:[开始索引:结束索引:间隔值 (2)[:结束索引 ...

  6. jquery展开收缩列表

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  7. HDU6184【Counting Stars】(三元环计数)

    题面 传送门 给出一张无向图,求 \(4\) 个点构成两个有公共边的三元环的方案数. 题解 orz余奶奶,orz zzk 首先,如果我们知道经过每条边的三元环个数\(cnt_i\),那么答案就是\(\ ...

  8. 常用博客 API地址

    新浪博客 http://upload.move.blog.sina.com.cn/blog_rebuild/blog/xmlrpc.php 网易博客 http://os.blog.163.com/ap ...

  9. linux性能评估与分析工具---CPU篇

    一. uptime root@calm:~# uptime :: up days, :, user, load average: 0.04, 0.09, 0.04 这里主要关注load average ...

  10. java集合类学习笔记之LinkedHashMap

    1.简述 LinkedHashMap是HashMap的子类,他们最大的不同是,HashMap内部维护的是一个单向的链表数组,而LinkedHashMap内部维护的是一个双向的链表数组.HashMap是 ...