Part 1. 推流端
推流,就是将采集到的音频,视频数据通过流媒体协议发送到流媒体服务器。
一、选择流媒体协议
现在直播应用,采用 RTMP 协议居多,也有部分使用 HLS 协议。
采用RTMP协议,就要看下它与流媒体服务器交互的过程,RTMP协议的默认端口是1935,采用 TCP 协议。并且需要了解 FLV 的封装格式。
采用 HLS 协议,因为涉及到切片,延时会比较大,需要了解 TS 流。
采用UIGraphics将两幅图绘制到同一个画布上输出,达到图像融合的简单效果。
该文的内容在我之前的文章中已经实现过,但是为了结构清晰起见,本文将相机控制和采集视频数据功能封装为单独的库。
iOS上使用AVFoundation.framework框架来调用系统相机并获取视频数据。视频数据可以根据设定的参数,可采集到RGB或YUV数据,一般使用的是GBRA32,420v,420f,下面演示相机的调用和视频数据的获取。
a)引入框架的头文件#import <AVFoundation/AVFoundation.h>
b)调用的类遵守协议AVCaptureVideoDataOutputSampleBufferDelegate
本人小硕一枚,科班出身,毕业后在公司做过iOS应用开发工程师,搞过iOS项目移植到flash、unity3d平台的开发,在流媒体行业内实力不错的公司做过播放器开发工程师,现在在一家互联网公司做音视频编解码工程师。
以前,就想着把自己实战经历过的项目经验总结并分享下,个人觉得在分享的过程中,会加深对知识点和技术的认识,同时也能帮助下一些人。值得开心的是,去年4月份左右,具体时间记不得请了,北京的一家做游戏应用内支付的公司的iOS工程师看到我的博客园博客后,联系我寻求iOS项目移植到flash平台的帮助。经过半个月时间与我沟通,项目移植成功上线了。在小型互联网公司,工程师可谓是孤军奋战。分享自己所学和经历是一件很兴奋,很开心的事。
在iOS平台上使用iOS8及以上系统的VideoToolbox进行硬编码,会涉及到CMTime,CMTimeMake,CMTimeMakeWithSeconds的使用。下面说下这几个结构体的作用。
CoreMedia.framework的CMTime.h中CMTime,CMTimeMake,CMTimeMakeWithSeconds的定义如下: