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】(播放篇)

你可能感兴趣的:(ios之视频/音频的录制和使用)