最近在处理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. Intel Galileo Debian Image Prequits

    Intel Galileo开发板 Debian镜像 在原发布者的基础上进行了更新,附带开发入门套件,打包内容: -intel_galileo_debian_xfce4镜像 -约3GB -putty - ...

  2. 系统数据库--修改tempdb的位置

    use mastergoAlter database tempdb modify file (name = tempdev, filename = 'G:\db\tempdb.mdf')goAlter ...

  3. android ART-逆向研究者的福音?

    android 4.4起,提供了一种与Dalvik截然不同的运行环境-ART(Android Runtime)的支持.目前用户可以选择设备的运行环境,在不久的将来ART肯定会替代Dalvik Runt ...

  4. 【git】常用命令

    // 下载Git项目git clone url // 显示当前git配置git config --list // 设置用户信息git config --global user.name "& ...

  5. WebApi中跨域请求的解决方案和原理

    跨域请求仅发生在JavaScript发起Ajax请求时,浏览器对请求的限制,通常只允许访问同一个域中的资源,或者目标服务器明确的通知浏览器允许该域访问资源. 那么什么叫跨域的:主机地址或者ip地址或者 ...

  6. C++ STL详解

    C++ STL详解 转载自:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html 一.STL简介 STL(Standard ...

  7. oracle-01427

    Oracle / PLSQL: ORA-01427 Learn the cause and how to resolve the ORA-01427 error message in Oracle. ...

  8. 快速排序 java实现 (原理-优化) 三路快排

    一.基本的快速排序 在数组中选取一个元素为基点,然后想办法把这个基点元素移动到它在排好序后的最终位置,使得新数组中在这个基点之前的元素都小于这个基点,而之后的元素都大于这个基点,然后再对前后两部分数组 ...

  9. BZOJ2430 chocolate

    有一个显然的想法是因为最后要花分成n*m个小块,所以每条边一定是要被切开的. 所以直接排序就可以了qwq,按照代价从大到小切一定是最优的. #include<iostream> #incl ...

  10. 【06】循序渐进学 docker:跨主机通信

    写在前面的话 目前解决容器跨主机通信的方案有很多种,这里给出的只是其中的一种,而且还不是最好的方案,不过归根结底,大同小异.在学习 docker swarm 之前,大家可以先看看这种. 啥是 over ...