【音乐拼接】WAV格式
预备知识
必备基础知识用4个字节 表示一个整数
每个字节8位 字节可以用无符号整数(十进制)来表示(0-255)
假设有如下4个字节
194 021 001 000
分别转换成16进制为
C2 15 01 00
高位在前 于是如下
15C2 0001
再转 如下
000115C2 (这个就是4字节表示的整数对应的16进制)
转成10进制如下
71106======================================================================================开始 真正内容
wav文件 = 文件头 + 数据体文件头 44个字节前12个字节用来说明文件是哪种类型 (如下字节)082 073 070 070 202 043 000 000 087 065 086 069 ------ a.wav
082 073 070 070 234 046 000 000 087 065 086 069 ------ b.wav
082 073 070 070 120 048 000 000 087 065 086 069 ------ c.wav
082 073 070 070 194 021 001 000 087 065 086 069 ------ d.wav这12个字节里面第5-8个字节是不一样的,其他一样,这四个字节就表示一个整数,该整数为:从下一个地址开始到文件尾的总字节数。
也就是说,前8个字节加上该整数就等于本wav文件总字节数,不信可以自己算算,百发百中。。。剩下 32 个字节分为两个部分。
12-35 字节用来说明文件结构
36-43 字节用来说明数据大小
44到最后就是数据体刚才分析到前12个字节,继续
13-16字节 表示 fmt ,波形格式标志102 109 116 032 ------ a.wav
102 109 116 032 ------ b.wav
102 109 116 032 ------ c.wav
102 109 116 032 ------ d.wav
可以看到都一样17-20字节 过滤字节(一般为00000010H)
016 000 000 000 ------ a.wav
016 000 000 000 ------ b.wav
016 000 000 000 ------ c.wav
016 000 000 000 ------ d.wav
可以看到都一样21-22字节 整数 格式种类(值为1时,表示数据为线性PCM编码)
001 000 ------ a.wav
001 000 ------ b.wav
001 000 ------ c.wav
001 000 ------ d.wav
也是一样23-24字节 整数 通道数,单声道为1,双声道为2
001 000 ------ a.wav
001 000 ------ b.wav
001 000 ------ c.wav
001 000 ------ d.wav
表示都是单声道,特意用格式工厂转了一个2声道的,变成 002 000 正确25-28 采样频率
034 086 000 000 ------ a.wav 十进制 22050
034 086 000 000 ------ b.wav 十进制 22050
034 086 000 000 ------ c.wav 十进制 22050
034 086 000 000 ------ d.wav 十进制 22050
4个文件都一样29-32 每次采样的数据块大小 它跟下面的采样精度有关
034 086 000 000 ------ a.wav 十进制 22050
034 086 000 000 ------ b.wav 十进制 22050
034 086 000 000 ------ c.wav 十进制 22050
068 172 000 000 ------ d.wav 十进制 44100
注意不同的地方33-34 整数 它 = 通道数 * 采样精度 / 8
001 000 ------ a.wav
001 000 ------ b.wav
001 000 ------ c.wav
002 000 ------ d.wav35-36 整数 采样精度是多少位
008 000 ------ a.wav 8位
008 000 ------ b.wav 8位
008 000 ------ c.wav 8位
016 000 ------ d.wav 16位37-40 表示“data”或者“LIST”四个字符,data表示单个音乐,LIST表示合成?或许是这样,因为我的d.wav 是在格式工厂里用 abc合成的
100 097 116 097 ------ a.wav
100 097 116 097 ------ b.wav
100 097 116 097 ------ c.wav
076 073 083 084 ------ d.wav41-44 整数 数据体长度(字节数)166 043 000 000 ------ a.wav 十进制11174 已检验正确
197 046 000 000 ------ b.wav 十进制11973 已检验差一个字节 基本正确
083 048 000 000 ------ c.wav 十进制12371 已检验差一个字节 基本正确
026 000 000 000 ------ d.wav 十进制26 严重错误 格式工厂转换问题
程序代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;namespace Wav
{class Program{static void Main(string[] args){List<string> ls = new List<string> {@"C:\Users\Administrator\Desktop\b.wav",@"C:\Users\Administrator\Desktop\c.wav",@"C:\Users\Administrator\Desktop\a.wav",@"C:\Users\Administrator\Desktop\out.wav"};Get_wav(ls);}static void Get_wav(List<string> l){List<string> ls = l;int n = ls.Count;byte[] OUT = File_2_byte(ls[0]);for (int i = 0; i < n; i++){if (i == n - 2){using (StreamWriter sw = new StreamWriter(ls[i + 1], false, Encoding.GetEncoding(1252))){sw.Write(Encoding.GetEncoding(1252).GetString(OUT));}return;}byte[] tmp = File_2_byte(ls[i + 1]);OUT = Save_Wav(OUT, tmp);}}static byte[] File_2_byte(string url){long l = new FileInfo(url).Length;byte[] b = new byte[l];new FileStream(url, FileMode.Open).Read(b, 0, (int)l);return b;}static byte[] Save_Wav(byte[] buffer1, byte[] buffer2){long len1 = buffer1.Length;long len2 = buffer2.Length;byte[] Head1 = Get_small_byte(buffer1, 0, 44);byte[] Head2 = Get_small_byte(buffer2, 0, 44);byte[] Data1 = Get_small_byte(buffer1, 44, len1);byte[] Data2 = Get_small_byte(buffer2, 44, len2);byte[] DATA = Combine_2_byte(Data1, Data2);long L = DATA.Length + 44;byte[] HEAD = new byte[44];Get_small_byte2(ref HEAD, 0, Head1, 0, 4); //0-3Get_small_byte2(ref HEAD, 4, Get_4_byte(L - 8), 0, 4); //4-7Get_small_byte2(ref HEAD, 8, Head1, 8, 36); //8-35Get_small_byte2(ref HEAD, 36, Head1, 36, 40); //36-39Get_small_byte2(ref HEAD, 40, Get_4_byte(DATA.Length), 0, 4); //40-43return Combine_2_byte(HEAD, DATA);}static byte[] Combine_2_byte(byte[] a , byte[] b){long la = a.Length;long lb = b.Length;long lc = la + lb;byte[] c = new byte[lc];for(int i =0;i< la; i++){c[i] = a[i];}for (int i = 0; i < lb; i++){c[i+la] = b[i];}return c;}static byte[] Get_small_byte(byte[] a,long start,long end)//[start,end){long la = a.Length;long lc = end - start;byte[] c = new byte[lc];for(long i = start;i< end; i++){c[i - start] = a[i];}return c;}static void Get_small_byte2(ref byte[] HEAD, long f,byte[] a, long start, long end){long la = a.Length;for (long i = start; i < end; i++){HEAD[i - start + f] = a[i];}}static byte[] Get_4_byte(long a){byte[] b = new byte[4];b = BitConverter.GetBytes((int)a);return b;}}
}
【音乐拼接】WAV格式相关推荐
- ffmpeg命令转音乐为wav格式,wav格式与PCM数据相互转换,ffplay播放PCM数据
1.卸载ffmpeg: brew uninstall ffmpeg 2.安装ffmpeg和ffplay brew install ffmpeg --with-ffplay 3.转MP3为wav ffm ...
- 【工具】音乐播放相关工具,音乐文件格式转换工具,MP3文件转换成arduino可以直接播放的wav格式,MP3转WAV工具...
微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 最近玩播放音乐又用到了audio.online-convert这个音乐转换工具,好用, ...
- 【MM32F5270开发板试用】播放TF卡WAV格式音乐,I2S驱动CS4344
[MM32F5270开发板试用]播放TF卡WAV格式音乐,I2S驱动CS4344 上四篇文章: [MM32F5270开发板试用]一.依靠SPI_SD,移植FatFs文件系统 [MM32F5270开发板 ...
- stm32 pwm播放wav格式音乐移植遇到的问题
前言 初识pwm的时候就想做音乐播放器,奈何51单片机速度慢,现在入手stm32,可玩性一下提高了很多,重拾当年挖的坑.既然要造轮子,那肯定先看看大牛是怎么做的.传送门:https://github. ...
- Qt ——QSound播放wav格式音乐
在使用Qt Create制作软件的时候,经常需要软件报警,这时候使用wav格式音乐就是一个很好的方法. 1. 修改pro文件 在文件中添加 QT += multimedia 2. 添加头文件声明 #i ...
- 关于java播放wav格式音乐问题及代码解释
修改成wav格式的音乐:使用酷狗的转换格式:(java 可以使用的格式之一) 播放音乐的源代码: 第一个 package com.button.One; import sun.audio.; impo ...
- MP3格式的音乐怎么转换成WAV格式
MP3格式怎么转换成WAV格式?WAV是最接近无损音乐的一种音频格式,所以深受不少人的喜爱,我们听音乐的时候,大部分歌曲是MP3格式的,这时想把mp3格式转换成WAV格式怎么办呢?接下来,主要跟大家分 ...
- 如何将计算机声音改成音乐,win7系统把MP3音频转换成WAV格式的图文教程
新购买的电脑安装 win7系统 ,开机时觉得系统默认的开机声音一点都不好听,想换开关机声音,但是在网上下载好的MP3音频格式不符合要求,要转换成wav格式,这时候该怎么转换呢?大家可通过搜狗播放器进行 ...
- PJSIP-PJMEDIA【使用pjmedia 播放wav格式的音乐】
应宝哥建议以及更好的交流学习,这篇开始使用中文,英语就先放一放吧! 要使用PJSIP中的PJMEDIA首先我们需要搭建好它所需要的环境. [环境搭建与调试] 1 在 工具 加入pjmedia所需要的包 ...
- 基于Python/Tkinter的wav格式音乐播放器
好久没写文章了,最近因为工作繁忙的缘故,将博文发表的进度落下来了,今天周末便从之前的写的小项目中搜寻了个WAV格式的音乐播放器(本来想将德州扑克的代码贴出来,但德州扑克的算法有些问题,汗&^- ...
最新文章
- 解决maven无法下载jar的问题
- HTML5中各种标签总结(body标签)
- .NET做人脸识别并分类
- IT从业者的迷思与求解之道——座谈会实录摘选
- html中文字过长 自动隐藏,css 实现文字过长自动隐藏功能
- php如何使用高阶函数
- mysql的压缩包,mysql 压缩包安装
- 1458: 移动距离(暴力模拟)
- Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
- 零门槛修改微信步数(基于虚拟xposed)
- 小程序中如何引用阿里图标
- 二维傅立叶变换和二维傅立叶反变换
- 常见电子元器件的常用品牌汇总
- css 默认显示滚动条,css控制默认滚动条样式
- mtk处理器和骁龙对比_联发科(MTK)智能手机处理器平台汇总(含基本参数对比)一览...
- 浏览器主页被2345拦截
- Ubuntu安装SS及win10下客户端使用指南
- 互动媒体技术作业——processing码绘
- 为Eclipse安装安卓开发插件ADT
- BZOJ 1124 [POI2008]枪战Maf 贪心+乱搞
热门文章
- visual assist x 2406 和 2435,2443 原版安装下载,只要一分
- 高德地图报Native method not found: com.autonavi.amap.mapcore.MapCore.nativeNewInstance:
- Windows服务详解
- HTML5生日祝福网页制作 (粉色系列为你定制) HTML+CSS+JavaScript
- vue中使用阿里巴巴矢量图标库的图标
- xp系统如可用计算机截图,WinXP系统电脑怎么截图 常见截图方法介绍
- 西门子Step7的AT指令示例
- Github客户端下载慢的解决方法
- ffmpeg: 一款跨平台开源媒体格式转换器
- java字体除了宋体,为什么许多中文网站的主要字体仍然采用宋体而不是微软雅黑?...