前言:最近一段时间都没更新了,主要是在研究直播方面的一些东西,到现在还没研究透,后续会把我研究的直播方面的知识分享给大家.现在正在模仿斗鱼写一个项目.
中间也遇到了很多问题,而且项目我是用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】(播放篇)