ios之视频/音频的录制和使用


前言:最近一段时间都没更新了,主要是在研究直播方面的一些东西,到现在还没研究透,后续会把我研究的直播方面的知识分享给大家.现在正在模仿斗鱼写一个项目.

中间也遇到了很多问题,而且项目我是用swift写的,找到的一些直播方面的框架不能很好的集成进去,如果有研究直播的朋友可以相互探讨下


一.录音


1.录音的基本使用

1.1 创建 AVAudioRecorder对象,并且要给对象指定路径

1.2 注意:创建 AVAudioRecorder对象的方法会抛出异常,要对异常进行处理

1.3 怎么处理异常?

三种方式 1.try 要配合do使用 2.try? 当抛出异常的方法有返回值的时候才可以使用,因为该方法是根据是否有返回值来判断是否有异常 3. try! 慎用,很危险的用法

1.4 注意:音频保存的格式为 .caf 或 .wav 保存MP3的格式不可行

2.设置音频的一些属性

2.1 设置录音的采样率(采样率越高,录音的品质越好,文件越大)

2.2 一般来说,采样率不会设置太高,能听清录音即可(专业录制音乐除外)

2.3 录音通道数(暂时不清楚具体意义)

// 1.录制音频的存放路径        
// let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, 
    .UserDomainMask, true).first! + "/123.mp3"

    let fileURL = NSURL(string: "/Users/lgp/Desktop/123.wav")!

    // 2.设置音频的一些属性
    let settings : [String : AnyObject] = [AVSampleRateKey : 8000, AVNumberOfChannelsKey : 0]

    // 3.创建AVAudioRecorder对象        
    guardlet recorder = try? AVAudioRecorder(URL: fileURL, settings: settings) else {            
        print("有异常")            
        return       
   }       

 self.recoder = recorder               
    // 4.开始录制
   recorder.record()
    //停止录制
   recoder.stop()

3.测量声音的大小

3.1 首先要设置录音的声音大小需要被测量

   // 5.告知系统recoder中的声音需要被测量
    recorder.meteringEnabled = true

3.2 添加定时器,实时监听声音的大小

   privatefunc addTimer() {
    self.timer = NSTimer(fireDate: NSDate(), interval: 0.1, 
    target: self, selector: #selector(self.updateSoundPower),  
    userInfo: nil, repeats: true)    

// 注意:必须把定时器加入到运行循环中才能正常工作
    NSRunLoop.mainRunLoop().addTimer(timer!, forMode: NSRunLoopCommonModes)    
  }      

   privatefunc removeTimer() {        
    // 从运行循环中移除 
    timer?.invalidate()        
  // 将控制器的强引用移除   
  timer = nil
 }   

@objcprivatefunc updateSoundPower() {        
    // 获取声音的大小        
    recoder?.updateMeters()       
     let power = recoder?.averagePowerForChannel(0)              
    print(power)
}

二.音效播放

1.步骤
1.1 定义SystemSoundID(要先导入AVFoundation框架
1.2 获取音频路径的URL
1.3 通过URL给SystemSoundID赋值
1.4 播放音效

// 1.定义SystemSoundID        
var soundID : SystemSoundID = 0  
         
// 2.获取音频路径的URL        
let url = NSBundle.mainBundle().URLForResource("lose.aac", withExtension: nil)!   
        
// 3.通过URL给SystemSoundID赋值        
AudioServicesCreateSystemSoundID(url asCFURLRef, &soundID)   

 // 4.播放音效  简单播放
    AudioServicesPlaySystemSound(soundID)        
// AudioServicesPlayAlertSound(soundID) 播放音效同时有震动效果        
AudioServicesPlaySystemSoundWithCompletion(soundID) {            
    print("播放完成了")       
}
// AudioServicesPlayAlertSoundWithCompletion(soundID) {}

三.音乐播放

1.基本使用
1.获取音乐文件的URL
2.根据URL创建 AVAudioPlayer对象

     privatelazyvar player : AVAudioPlayer? = {
    // 1.1.获取音乐文件的URL
    let fileURL = NSBundle.mainBundle().URLForResource("简单爱.mp3", withExtension: nil)!
  
    // 1.2.创建AVAudioPlayer对象        
    guardlet player = try? AVAudioPlayer(contentsOfURL: fileURL) else {            
        print("有异常")
        returnnil
    } 
    return player
}()
   // 播放音乐
    player?.play()

2.暂停,停止,快进,音量的设置
2.1 暂停player?.pause() 停止 player?.stop()
注意:暂停的时候,要把音乐的当前时间重置为0

  player?.currentTime = 0

音乐的总时间可以通过player?.duration获得

2.2 快进 音量
快进的原理就是把音乐的当前时间加上一个数值

 player?.currentTime += 10

音量通过player?.volume获得 取值范围 0~1

3.AVPlayer播放远程音频
3.1 根据音频的URL创建AVPlayerItem对象
3.2 根据AVPlayerItem创建AVPlayer对象

    privatelazyvar player : AVPlayer = {        
// 1.创建AVPlayerItem        
let item = AVPlayerItem(URL: NSURL(string: "http://cc.stream.qqmusic.qq.com/C100003j8IiV1X8Oaw.m4a?fromtag=52")!)      
    
// 2.创建player对象
    let player = AVPlayer(playerItem: item)
    return player
}()
  player.play()

3.3 暂停player.pause() ` 停止player.pause()
不同的是,把音乐当前时间设置为0 调用这个方法

        player.seekToTime(kCMTimeZero)

3.4 设置音量player.volume = ???快进
快进要进行类型转换

// 1.获取当前时间  获取的是CMTime类型
let currentTime = player.currentTime()    
       
// 2.将CMTime转成秒        
var currentSecond = CMTimeGetSeconds(currentTime)       
    
// 3.快进        
currentSecond += 10        
   
// 4.将秒转成CMTime
player.seekToTime(CMTimeMakeWithSeconds(currentSecond, Int32(NSEC_PER_SEC)))

四.视频播放的五种方式

1.AVPlayer播放视频

1.1 AVPlayer既可以播放音频,也可以播放视频
1.2 先创建AVPlayer对象
1.3 根据AVPlayer对象创建一个AVPlayerLayer对象
1.4 设置AVPlayerLayer的frame 并添加到控制器的view中 调用play方法就能播放了

  privatelazyvar player : AVPlayer = {        
let item = AVPlayerItem(URL: NSURL(string: 
"http://v1.mukewang.com/a45016f4-08d6-4277-abe6-bcfd5244c201/L.mp4")!)        
let player = AVPlayer(playerItem: item)               
return player
}()

// 设置画面        
// 1.创建播放器的Layer       
let playerLayer = AVPlayerLayer(player: player)   
        
// 2.给layer设置frame        
playerLayer.frame = CGRect(x: 0, y: 0, width: UIScreen.mainScreen().bounds.width, height: UIScreen.mainScreen().bounds.width * 9 / 16)                
// 3.将layer添加到控制器的View的layer中
 view.layer.addSublayer(playerLayer)

player.play()

1.5 缺点:没有画面,要自定义画面,而且没有快进,时间条等功能模块

2.AVPlayerViewController播放视频

2.1 AVPlayerViewController实际就是对AVPlayer的封装

   privatelazyvar playerVc : AVPlayerViewController = {       
 let playerVc = AVPlayerViewController()       
 return playerVc
}()

// AVPlayerViewController里面的内容是由AVPlayer提供        
let item = AVPlayerItem(URL: NSURL(string: "http://v1.mukewang.com/a45016f4-08d6-4277-abe6-bcfd5244c201/L.mp4")!)        let player = AVPlayer(playerItem: item)               playerVc.player = player
}

2.2 AVPlayerViewController是一个控制器 自带快进,播放条等功能,要通过modal方式显示出来

2.3 弹出之后不会自动播放,要自己播放 可以在弹出完成后直接播放

  presentViewController(playerVc, animated: true, completion: {                
      self.playerVc.player?.play()       
    })

3.MPMoviePlayerController播放视屏

3.1 可以不用全屏播放,更加灵活,自带快进等功能模块

3.2 ios9之后就过期了,但是还能使用

 privatelazyvar player : MPMoviePlayerController = {       
   let url = NSURL(string: "http://v1.mukewang.com/a45016f4-08d6-4277-abe6-bcfd5244c201/L.mp4")!  
         
  let player = MPMoviePlayerController(contentURL: url)                    
  return player
}()

 // 设置View       
 player.view.frame = CGRect(x: 0, y: 0, width:   
UIScreen.mainScreen().bounds.width, height: UIScreen.mainScreen().bounds.width * 9 / 16)     
       
// 将播放器的View添加到控制器的View中
    view.addSubview(player.view)

    player.play()

4.MPMoviePlayerViewController播放视频

4.1 自动全屏播放,不需要设置view的frame ios9之后就过期了,但是还能使用

4.2 注意:一般来说,视频的宽高比为16:9

4.3 弹出之后会自动播放

privatelazyvar player : MPMoviePlayerViewController = {    
    let url = NSURL(string: "http://v1.mukewang.com/a45016f4-08d6-4277-abe6-bcfd5244c201/L.mp4")! 
         
    let playerVc = MPMoviePlayerViewController(contentURL: url)               
    return playerVc
}()

  presentMoviePlayerViewControllerAnimated(player)

5.IJKPlayer播放视频

// IJKAVMoviePlayerController : 播放普通的远程视频    
// IJKFFMoviePlayerController : 播放直播的视频    
privatelazyvar ijkplayer : IJKFFMoviePlayerController = {        
    let url = NSURL(string: "http://121.31.23.13/live/9024589_1473066200413.flv?wsSecret=06203e4a2a50d22b6234a78b62446ce9&wsTime=57CD3F72&cid=3&ver=ngb&cip=ngb&wsiphost=ipdbm&wsHost=v.ngb.qf.56.com")!    
      
    let player = IJKFFMoviePlayerController(contentURL: url, withOptions: nil)              
     return player
}()

  ijkplayer.view.frame = view.bounds     
   
  view.addSubview(ijkplayer.view)     

  ijkplayer.scalingMode = .AspectFill    
  //准备播放
  ijkplayer.prepareToPlay()

注意:使用ijk播放 要先导入ijk框架,不过ijk框架要自己先编译一下才能使用
如何编译: iOS中集成ijkplayer视频直播框架 写的不错,可以去参考下

想要了解直播原理的朋友,可参考下这些文章,也是我最近看到,对直播方面的解析还是挺不错的
【如何快速的开发一个完整的iOS直播app】(原理篇)
【如何快速的开发一个完整的iOS直播app】(播放篇)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容