日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【音乐拼接】WAV格式

發布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【音乐拼接】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格式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。