预备知识

必备基础知识用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格式相关推荐

  1. ffmpeg命令转音乐为wav格式,wav格式与PCM数据相互转换,ffplay播放PCM数据

    1.卸载ffmpeg: brew uninstall ffmpeg 2.安装ffmpeg和ffplay brew install ffmpeg --with-ffplay 3.转MP3为wav ffm ...

  2. 【工具】音乐播放相关工具,音乐文件格式转换工具,MP3文件转换成arduino可以直接播放的wav格式,MP3转WAV工具...

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 最近玩播放音乐又用到了audio.online-convert这个音乐转换工具,好用, ...

  3. 【MM32F5270开发板试用】播放TF卡WAV格式音乐,I2S驱动CS4344

    [MM32F5270开发板试用]播放TF卡WAV格式音乐,I2S驱动CS4344 上四篇文章: [MM32F5270开发板试用]一.依靠SPI_SD,移植FatFs文件系统 [MM32F5270开发板 ...

  4. stm32 pwm播放wav格式音乐移植遇到的问题

    前言 初识pwm的时候就想做音乐播放器,奈何51单片机速度慢,现在入手stm32,可玩性一下提高了很多,重拾当年挖的坑.既然要造轮子,那肯定先看看大牛是怎么做的.传送门:https://github. ...

  5. Qt ——QSound播放wav格式音乐

    在使用Qt Create制作软件的时候,经常需要软件报警,这时候使用wav格式音乐就是一个很好的方法. 1. 修改pro文件 在文件中添加 QT += multimedia 2. 添加头文件声明 #i ...

  6. 关于java播放wav格式音乐问题及代码解释

    修改成wav格式的音乐:使用酷狗的转换格式:(java 可以使用的格式之一) 播放音乐的源代码: 第一个 package com.button.One; import sun.audio.; impo ...

  7. MP3格式的音乐怎么转换成WAV格式

    MP3格式怎么转换成WAV格式?WAV是最接近无损音乐的一种音频格式,所以深受不少人的喜爱,我们听音乐的时候,大部分歌曲是MP3格式的,这时想把mp3格式转换成WAV格式怎么办呢?接下来,主要跟大家分 ...

  8. 如何将计算机声音改成音乐,win7系统把MP3音频转换成WAV格式的图文教程

    新购买的电脑安装 win7系统 ,开机时觉得系统默认的开机声音一点都不好听,想换开关机声音,但是在网上下载好的MP3音频格式不符合要求,要转换成wav格式,这时候该怎么转换呢?大家可通过搜狗播放器进行 ...

  9. PJSIP-PJMEDIA【使用pjmedia 播放wav格式的音乐】

    应宝哥建议以及更好的交流学习,这篇开始使用中文,英语就先放一放吧! 要使用PJSIP中的PJMEDIA首先我们需要搭建好它所需要的环境. [环境搭建与调试] 1 在 工具 加入pjmedia所需要的包 ...

  10. 基于Python/Tkinter的wav格式音乐播放器

    好久没写文章了,最近因为工作繁忙的缘故,将博文发表的进度落下来了,今天周末便从之前的写的小项目中搜寻了个WAV格式的音乐播放器(本来想将德州扑克的代码贴出来,但德州扑克的算法有些问题,汗&^- ...

最新文章

  1. 解决maven无法下载jar的问题
  2. HTML5中各种标签总结(body标签)
  3. .NET做人脸识别并分类
  4. IT从业者的迷思与求解之道——座谈会实录摘选
  5. html中文字过长 自动隐藏,css 实现文字过长自动隐藏功能
  6. php如何使用高阶函数
  7. mysql的压缩包,mysql 压缩包安装
  8. 1458: 移动距离(暴力模拟)
  9. Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
  10. 零门槛修改微信步数(基于虚拟xposed)
  11. 小程序中如何引用阿里图标
  12. 二维傅立叶变换和二维傅立叶反变换
  13. 常见电子元器件的常用品牌汇总
  14. css 默认显示滚动条,css控制默认滚动条样式
  15. mtk处理器和骁龙对比_联发科(MTK)智能手机处理器平台汇总(含基本参数对比)一览...
  16. 浏览器主页被2345拦截
  17. Ubuntu安装SS及win10下客户端使用指南
  18. 互动媒体技术作业——processing码绘
  19. 为Eclipse安装安卓开发插件ADT
  20. BZOJ 1124 [POI2008]枪战Maf 贪心+乱搞

热门文章

  1. visual assist x 2406 和 2435,2443 原版安装下载,只要一分
  2. 高德地图报Native method not found: com.autonavi.amap.mapcore.MapCore.nativeNewInstance:
  3. Windows服务详解
  4. HTML5生日祝福网页制作 (粉色系列为你定制) HTML+CSS+JavaScript
  5. vue中使用阿里巴巴矢量图标库的图标
  6. xp系统如可用计算机截图,WinXP系统电脑怎么截图 常见截图方法介绍
  7. 西门子Step7的AT指令示例
  8. Github客户端下载慢的解决方法
  9. ffmpeg: 一款跨平台开源媒体格式转换器
  10. java字体除了宋体,为什么许多中文网站的主要字体仍然采用宋体而不是微软雅黑?...