最近在用swift 做一个录音的项目,中间学习了一些语法 , 现在封装了录音类 ,和大家分享学习一下。
录音封装类主要分为4个部分,录音,暂停,播放,保存,
一(知识点梗概)首先大致说下录音需要的一些知识点和框架
这里主要用到了avfoundation 这个框架,还有这里不得不提到一个就是AVAudioSession
你必须通过AVAudioSession.sharedInstance() 获得音频会话的实例,然后音频会话进行设置
do {
try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
try session.setActive(true);
}catch
{
print("session 设置失败")
}
设置相应的session 模式就各种做相应的操作这里主要用到了两种
AVAudioSessionCategoryPlayAndRecord 这种用于录音
AVAudioSessionCategoryPlayback 此种可以适用于播放音乐
二 录音封装类大概思路
1 录音的时候将会保存在一个固定的地址,每次录音就覆盖这个文件,防止生成多余的垃圾文件, 保存的时候将当前录音另存到,另一个录音的路径下,并且为了防止文件命名重复,使用当前时间给文件命名,并且使用一个userdefault 去保存相关的录音信息, 路径,大小,和时间
2 关键代码
这里比较麻烦的也就是,保存录音这个环节,大体是要将要保存的录音 另存到 audio 的目录下,然后将录音文件相关信息,保存到userdefault,
func saveRecord(){
let docDir: AnyObject = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
.UserDomainMask, true)[0]
//组合录音文件路径
//
let date : NSDate = NSDate()
let timeInterval = date.timeIntervalSince1970*1000
let timeStr = String(format:"%f",timeInterval)
let saveAacPath = (docDir as! String) + "/audio/" + timeStr + ".aac"
//
let fileManager = NSFileManager.defaultManager()
//创建另存为路径
let isDirExist = fileManager.fileExistsAtPath((docDir as! String) + "/audio")
if !isDirExist{
do
{
try fileManager.createDirectoryAtPath((docDir as! String) + "/audio", withIntermediateDirectories: true, attributes: nil)
}
catch
{
}
}
if fileManager.fileExistsAtPath(aacPath!)
{
do
{
try fileManager.copyItemAtPath(aacPath!, toPath: saveAacPath)
let userDefault:NSUserDefaults = NSUserDefaults.standardUserDefaults()
var audioDict = [String:String]()
var arr = [[String :String]]()
if let a = userDefault.objectForKey("audio")
{
arr = a as! [[String : String]]
}
do{
let dict = try fileManager.attributesOfItemAtPath(saveAacPath)
let fileSize = dict["NSFileSize"] as! CGFloat
audioDict = ["path" : saveAacPath,"second":String(seconds/10),"size":String(format: "%.2f",fileSize/(1024.0*1024.0)),"time":getTodayTime()]
}
catch
{
audioDict = ["path" : saveAacPath,"second":String(seconds/10),"size":"0","time":getTodayTime()]
}
arr += [audioDict]
print("arr is %@",arr)
userDefault.setObject(arr, forKey: "audio")
userDefault.synchronize()
}
catch
{
print("复制失败")
}
}
}
https://github.com/heysunnyboy/Recorder.git
简单的demo 上传至以上链接,demo需要 先录音 然后暂停录音 ,才可以播放
网友评论