我正在编写一个有关在使用swift时使用la脚录制和转换音频的功能。
我使用AVAudioRecorder录制。wav,然后用lame转换为。mp3。在记录和转换之前,我还设置了设置。似乎可行,但是。mp3文件的播放速度是。wav文件的两倍。
这里是录像机设置:
try session.setCategory(.playAndRecord)
try session.setActive(true)
recorder = try AVAudioRecorder(url: filePathURL, settings: [
AVFormatIDKey: Int(kAudioFormatLinearPCM),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 1,
AVLinearPCMBitDepthKey: 16,
AVEncoderAudioQualityKey:AVAudioQuality.high.rawValue
])
和转换功能:
var read = 0
var write = 0
let pcm = fopen(m4aPath, "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 rate: Int32 = 128
let lame = lame_init()
lame_set_num_channels(lame, 1)
// lame_set_mode(lame, MONO)
lame_set_in_samplerate(lame, 44100)
// 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_close(lame)
fclose(mp3)
fclose(pcm)
任何帮助将不胜感激。谢谢〜
似乎您正在以44.1 kHz的频率进行录制,但随后您告诉mp3编码器音频是在22.05 kHz的情况下采样的。
如果要创建以22.05 kHz采样的mp3,则必须先重新采样。
或将lame_set_in_samplerate(lame, 22050)
更改为lame_set_in_samplerate(lame, 44100)