纯Python给ulaw wav文件加头

时间:2022-11-01 18:16:44

最近在处理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 通过 &period;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&period;svn 彻底clear时,注意代码备份 2&period;借助vc助手加头文件

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

  7. python 播放 wav 文件

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

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

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

  9. Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

随机推荐

  1. leetcode&lpar;一&rpar;Word Pattern

    题目描述: Given a pattern and a string str, find if str follows the same pattern. Here follow means a fu ...

  2. svn安装【转载】

    SVN简介        SVN全名Subversion,即版本控制系统.SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操作系统.作为一个开源的版本控制系统,Subversion管理着随时间 ...

  3. Solr数据库连接之多表关联

    Solr环境配置好后,有很多时候我们需要把数据库里的数据添加到索引里,这时就需要配置跟数据库的连接,下面我们看配置的步骤. 1. 配置 solrconfig.xml  (在slor 主目录 core ...

  4. OpenRisc-47-or1200的WB模块分析

    引言 “善妖善老,善始善终”,说的是无论什么事情要从有头有尾,别三分钟热度. 对于or1200的流水线来说,MA阶段是最后一个阶段,也是整条流水线的收尾阶段,负责战场的清扫工作.比如,把运算指令的运算 ...

  5. QtWebEngine加载资料缓慢

    最近由于项目需要(另外Qt后续版本也将不再支持QtWebKit),把Qt工程涉及QtWebKit的移植为QtWebEngine,用的Qt版本为5.5.0,结果出现QWebEngineView加载网页是 ...

  6. gdb常用命令记录

    gdb常用命令 最近在研究nginx源码,gdb用于调试非常方便,之前这篇有研究过如何使用gdb调试nginx:https://www.cnblogs.com/yjf512/archive/2012/ ...

  7. 微服务化不同阶段 Kubernetes 的不同玩法

    本文由  网易云发布. 作为容器集群管理技术竞争的大赢家,Kubernetes 已经和微服务紧密联系,采用 Kubernetes 的企业往往都开始了微服务架构的探索.然而不同企业不同阶段的微服务实践面 ...

  8. ios9 适配的坑

    http://www.cocoachina.com/ios/20151016/13715.html

  9. UOJ &num;126 【NOI2013】 快餐店

    题目链接:快餐店 震惊!某ZZ选手此题调了一天竟是因为……>>点击查看 一般碰到这种基环树的题都要先想想树上怎么做.这道题如果是在树上的话……好像求一遍直径就做完了?答案就是直径长度的一半 ...

  10. 【C&num;学习笔记】反射的简单用法

    常见的使用反射的场景: 程序在运行时动态地访问类的成员,如获得类的变量.方法. 例如:用反射给本类的变量赋值. public class Student{ public string studentN ...