0%

用 lame 把 wav 转换成 mp3

前言

项目中用到了录制音频转换成 mp3 后上传,网上查的都是 OC 写的,这里用的 swift 4.2,记录一下。

录制

1
2
3
4
5
6
7
recorder = try AVAudioRecorder(url: filePathURL, settings: [
AVFormatIDKey: Int(kAudioFormatLinearPCM),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 1,
AVLinearPCMBitDepthKey: 16,
AVEncoderAudioQualityKey:AVAudioQuality.high.rawValue
])

编译 lame 静态库

https://github.com/wuqiong/mp3lame-for-iOS

转换

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
var read = 0
var write = 0

let pcm = fopen(wavPath, "rb")
fseek(pcm, 4*1024, SEEK_CUR)
let mp3 = fopen(mp3Path, "wb+")

let pcmSize = 8192
let mp3Size = 8192

let pcmBuffer = UnsafeMutablePointer<Int16>.allocate(capacity: Int(pcmSize*2))
let mp3Buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: Int(mp3Size))


let lame = lame_init()
lame_set_num_channels(lame, 1)
// lame_set_mode(lame, MONO)
lame_set_in_samplerate(lame, 22050)
// lame_set_brate(lame, rate)
lame_set_VBR(lame, vbr_default)
lame_init_params(lame)

repeat {
read = fread(pcmBuffer, 2*MemoryLayout<Int16>.size, pcmSize, pcm)
if read == 0 {
write = Int(lame_encode_flush(lame, mp3Buffer, Int32(mp3Size)))
} else {
write = Int(lame_encode_buffer_interleaved(lame, pcmBuffer, Int32(read), mp3Buffer, Int32(mp3Size)))
}

print("write\(write)")
fwrite(mp3Buffer, write, 1, mp3)

} while read != 0
// lame_mp3_tags_fid(lame, mp3)
lame_close(lame)
fclose(mp3)
fclose(pcm)

遗留问题

录制时候采样率为 44100,转换时如果设置 44100 的采样率,发现会播放两倍速,减半成 22050 以后正常,这个等我学习点理论知识以后再来补充。