最近在处理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. Android 画指南针

    1.无意看到了一个指南针的UI,在这里简单的模仿了一下.其实就是第画布的一些变化而已. 别人的效果图是: 3.简单说一下思路: 1)首先是画一个黑色圆盘 2) 然后画圆盘上的刻度(就是对Canvas一 ...

  2. .Net程序随系统开机启动(仿Foxmail托盘效果控制)

    对于使.NET程序随系统开机启动,最常用的可能就是向在注册表中注册开机启动项,或是建立Windows服务,使程序随系统启动而启动.这里以WinForm程序为例,测试Demo分享,同时附上对于程序托盘的 ...

  3. [Erlang10]为什么热更新时,Shell执行2次l(Module)后会把原来用到Module的进程 kill?

    0. 问题引入: -module(hot_code_server). -compile(export_all). start() –> erlang:register(?MODULE, erla ...

  4. Android Post方式发送信息和获取URL中的图片

    需要Internet权限,AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET& ...

  5. softmax,softmax loss和cross entropy的讲解

    1 softmax 我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等.这一篇主要介绍全连接层和损失层的内容, ...

  6. 【07】循序渐进学 docker:数据持久化

    写在前面的话 学到这里相信有心的朋友都发现问题了,我们每次都会去删掉容器,在创建新的容器.那数据怎么办?岂不删库跑路了? 就算不是数据库,假设公司有日志保留的需求,那每一次发布岂不日志都被干掉了? D ...

  7. python 特性:height-->while

    """ 出题:height 女生找对象 男生在1米-1.5米之间 小强你在哪里? 男生在1.5-1.7米之间 没有安全感 男生在1.7 - 1.8米之间 帅哥 留个电话 ...

  8. OCP换题库了,052新加的考题及答案整理-第16题

    16.Your database Is configured In archivelog mode. The USERS01 tablespace Is currently online. You a ...

  9. “全栈2019”Java第七十四章:内部类与静态内部类相互嵌套

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. “全栈2019”Java第六十八章:外部类访问内部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...