一直在忙, 也没写过几次播客! 但一直热衷于直播开发技术, 公司又不是直播方向的, 所以就年前忙里偷袭研究了一下直播开发, 然后翻阅了很多大神的技术博客等, 写了一个简单的Demo, 又根据网上大神们的技术博客搭建了简易的本地RTMP服务器! 由于时间问题, 没来记得来记录下来, 目前demo 只完成了直播音视频采集, 转码, RTMP协议推流, 和本地RTMP简易服务器 推流这一环节, 拉流还没来得及写, RTMP流的播放用的是VLC, 来实现视频流的播放的!
网上有各种大牛写的播客, 都很好的, 但我写这篇播客的目的就是, 想记录一下当时的思路, 还有分享出来, 让各位大神指点一下不足之处, 来完善这个小项目! 表达一下我对直播开发的热爱哈哈...如果有幸能给大家帮些忙, 我倍感荣幸!
好, 废话不多说, 接下来我们直接开始!
代码链接: Github: https://github.com/jessonliu/JFLivePlaye
技术部分------ ⬇️
脑涂: ![ 直播思维导图.png ]
视频直播的大概流程就上脑涂上所画的, 还有一些没列出来, 比如, 聊天, 送礼, 踢出, 禁言, 等等一系列功能, 但本文只是针对视频直播的简单实现!
下边来说一下以下的几个点和使用到的类(后边会附上demo, 里边还有详细的备注)
1. 音视频采集
音视频采集, 网上也有很多大神些的技术博客, demo 等, 我这里边只针对iOS 原声的来介绍以下
利用AVFoundation框架, 进行音视频采集
AVCaptureSession // 音视频录制期间管理者
AVCaptureDevice // 设备管理者, (用来操作所闪光灯, 聚焦, 摄像头切换等)
AVCaptureDeviceInput // 音视频输入数据的管理对象
AVCaptureVideoDataOutput // 视频输出数据的管理者
AVCaptureAudioDataOutput // 音频输出数据的管理者
AVCaptureVideoPreviewLayer // 用来展示视频的图像
注意, 必须要设置音视频输出对象的代理方法, 然后在代理方法中获取sampleBuffer, 然后判断captureOutput是音频还是视频, 来进行音视频数据相应的编码
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
}
也可以利用GPUImageVideoCamera 来进行视频数据的采集获取, 可以利用GPUImage 进行美颜, 添加水印, 人脸识别等
2.流媒体
流媒体是指采用流式传输的方式在网上播放的媒体格式, 是边传边播的媒体,是多媒体的一种!
然后就是大家需要了解的几个关键词
帧:视频是由很多连续图像组成, 每一帧就代表一幅静止的图像
GOP:(Group of Pictures)画面组,一个GOP就是一组连续的画面,每个画面都是一帧,GOP就是很多帧的集合!
帧的分类:I帧、P帧、B帧
为了提高压缩比例,降低视频文件的大小,在针对连续动态图像编码时,一般会将连续若干幅图像编码为P、B、I三种帧类型
I帧:一组连续画面(GOP)的第一个帧, I帧采用帧内压缩法(也成关键帧压缩法), I帧的压缩不依靠与其他帧, 靠尽可能去除图像空间冗余信息来压缩的, 可以单独作为图像!
P帧:预测帧(也叫前向参考帧), P帧的压缩依赖于前一帧, 通过充分降低与图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像!
B帧:也叫双向预测帧, 当把一帧压缩成B帧时,它根据邻近的前几帧、本帧以及后几帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。
帧率:就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用FPS表示, 每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅!
码率: 也成为比特率, 是指每秒传送的比特(bit)数, 比特率越高,传送数据速度越快, 单位为 bps(Bit Per Second)。
3. 音视频的编解码
音视频编解码, 说白了就是对音视频数据进行压缩, 减少数据对空间的占用, 便于网络传输, 存储和使用!
目前直播常用的音视频编解码方式是h.264/AVC, AAC/MP3
硬软编解码的区别:
硬解码:由显卡核心GPU来对高清视频进行解码工作,CPU占用率很低,画质效果比软解码略差一点,需要对播放器进行设置。
优点:播放流畅、低功耗
缺点:受视频格式限制、功耗大、画质没有软解码好
软解码:由CPU负责解码进行播放
优点:不受视频格式限制、画质略好于硬解
缺点:会占用过高的资源、对于高清视频可能没有硬解码流畅(主要看CPU的能力)
苹果API有提供音视频硬编解码接口, 但只针对iOS8.0以上版本!
利用VideoToolbox 和AudioToolbox 这连个框架进行音视频的硬编码!
这里附上前辈们的关于VideoToolbox使用的简书, http://www.jianshu.com/p/6dfe49b5dab8
和AudioToolbox的技术简书ht