假设要合并 a.wav 和 b.wav,步骤如下:

  1. 读取 a.wav 的文件头,也就是 wav 文件开头的 44 个字节。
  2. 读取 b.wav 的文件头 ,把 a.wav 的文件头中的文件大小和数据大小 (详细位置参考 wav 文件结构),分别加上 b.wav 的文件头中的文件大小和数据大小。
  3. 把 a 和 b 的 data 合起来。
  4. 保存。
encoding/binary
go get github.com/wuid/libwav-go

源码在此:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

author : WUID
qq : 3310975439
email : 3310975439@qq.com
github : https://github.com/WUID/libwav-go
*/

package WAV

import (
"os"
"encoding/binary"
)

type Wav struct {
dsize uint32
fsize uint32
head []byte
data []byte
}

func () *Wav {
w := &Wav {}
w.fsize = 0
w.dsize = 0
w.head = make([]byte, 44)
return w
}

func (self *Wav) Load(file string) {
var fsz []byte = make([]byte, 4)
var dsz []byte = make([]byte, 4)

f, _ := os.Open(file)
defer f.Close()
f.Read(self.head)

for i := 0; i < 4; i++ {
fsz[i] = self.head[i + 4]
dsz[i] = self.head[i + 40]
}

self.fsize = binary.LittleEndian.Uint32(fsz)
self.dsize = binary.LittleEndian.Uint32(dsz)

self.data = make([]byte, self.dsize)
f.ReadAt(self.data, 44)
}

func (self *Wav) Splice(other *Wav) {
newfsz := make([]byte, 4)
newdsz := make([]byte, 4)

self.fsize += (other.fsize + 8)
self.dsize += other.dsize

binary.LittleEndian.PutUint32(newfsz, self.fsize)
binary.LittleEndian.PutUint32(newdsz, self.dsize)

for i := 0; i < 4; i++ {
self.head[i + 4] = newfsz[i]
self.head[i + 40] = newdsz[i]
}

self.data = append(self.data, other.data...)
}

//当我写这段代码的时候,有电脑和我知道这段代码是干什么的
//现在只有电脑知道了2333
调用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

author : WUID
qq : 3310975439
email : 3310975439@qq.com

*/

package main

import (
"fmt"
"github.com/wuid/libwav-go"
)

func main() {
fmt.Println("我是WUID,一个广door学生")

one := WAV.NewWav()
two := WAV.NewWav()

one.Load("1.wav") //使用之前要加载文件
two.Load("2.wav")

one.Splice(two) //把tow合并在one的后面

one.Save("3.wav") //保存为3.wav
}