直播信号

直播总结 1.概述
关于直播类app开发的技术文章不少,成体系的不多。我们将用这篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面、深入地了解视频直播类app开发技术,更好地技术选型。
1.1 一个完整的直播APP原理
: 把主播录制的视频,推流送到服务器,服务器经过处理(鉴黄等),通过CDN分发给观众看。
: 推流端(采集、美颜、编码、推流),服务端处理(转码、录制、截图、鉴黄)、播放器(拉流、解码、渲染)、互动系统(聊天室、礼物系统、赞)
1.2 一个完整直播APP实现流程
1.3 一个完整直播APP架构
1.4 一个完整直播APP技术点
下面我们会选择一部分技术进行讲解。
2. 视频采集 2.1 基本知识介绍
: 音视频数据采集需要用AVFundation框架
: 硬件设备,包括麦克风、摄像头、通过该对象可以设置物理设备的一些属性。例如相机焦距,白平衡等
: 硬件输入对象,可以根据AVCaptureDevice创建对应的AVCaptureDeviceInput对象,用于管理硬件输入数据
: 硬件输出对象,用于接收各类输出数据,通常使用对应的子类AVCaptureAudioDataOutput(声音数据输出对象), AVCaptureVideoDataOutput(视频输出对象)
: 当把一个输入和输出添加到AVCaptureSession后。AVCaptureSession就会在输出、输出设备之间建立连接,而且通过AVCaptureOutput可以获得这个对象
: 相机拍摄预览图层,能实时查看相机效果。创建该对象需要指定对应的AVCaptureSession对象,因为AVCaptureSession包含输出数据,有视频数据才能显示。
: 协调输入与输出之间传递数据
2.2 捕获音视频步骤
包含关系:
步骤:
创建AVCaptureDevice(video或者audio)根据AVCaptureDevice创建AVCaptureDeviceInput。创建AVCaptureSession把创建的AVCaptureDeviceInput加入AVCaptureSession添加视频预览图层AVCaptureVideoPreviewLayer创建AVCaptureAudioDataOutput,并加入AVCaptureSession启动会话
官方步骤(可以忽略):
创建AVCaptureSession对象获取AVCaptureDevice录像设备(摄像头),录音设备(麦克风)维罗纳推荐分析预测。只用于配置根据音频/视频硬件设备(AVCaptureDevice)创建音频/视频硬件输入数据对象(AVCaptureDeviceInput),专门管理数据输入。创建视频输出数据管理对象(AVCaptureVideoDataOutput),并且设置样品缓存代理(setSampleBufferDelegate)就可以通过它拿到采集到的视频数据创建音频输出数据管理对象(AVCaptureAudioDataOutput),并且设置样品缓存代理(setSampleBufferDelegate)就可以通过它拿到采集到的音频数据将数据输入对象AVCaptureDeviceInput、数据输出对象AVCaptureOutput添加到媒体会话管理对象AVCaptureSession中,就会自动让音频输入与输出和视频输入与输出产生连接.创建视频预览图层AVCaptureVideoPreviewLayer并指定媒体会话,添加图层到显示容器layer中启动AVCaptureSession,只有开启,才会开始输入到输出数据流传输
其中、包含两个代理方法,可以一直监听捕获属性。
2.3 捕捉图片
可以将直播类app开发捕获到的Video转换为图片。
创建device根据device创建deviceInput添加deviceInput进session添加预览图层添加deviceOutput进session调用AVCaptureConnection生成图片
2.4 捕捉视频
可以将直播类app开发捕捉到的视频输出到磁盘。可以设置录制最长时限或录制到特定大小,还可以配置成保留最小可用磁盘空间。
创建device根据device创建deviceInput添加deviceInput进session添加预览图层添加deviceOutput进session调用AVCaptureMovieFileOutput把视频写入文件
包含有几个代理方法。分别是,,, , 。
2.5 采集音频视频按帧输出流程解析
1.找到物理设备摄像头_inputCamera、麦克风_microphone,创建摄像头输入videoInput和麦克风输入audioInput;
2.设置videoInput和audioInput为_captureSession的输入,同时设置videoOutput和audioOutput为_captureSession的输出,并且设置videoOutput和audioOutput的输出delegate;
3._captureSession调用startRunning,开始捕获信号;
4.音频数据到达,把数据转发给之前设置的audioEncodingTarget,并通过调用assetWriterAudioInput的appendSampleBuffer方法写入音频数据;
5.视频数据到达,视频数据传入响应链,经过处理后通过assetWriterPixelBufferInput的appendSampleBuffer方法写入视频数据;
6.选择保存后,文件通过ALAssertLibrary写入手机照片库。
3. GPUImage
可以,GPUImage对AVFundation进行了一层封装,就算你不会前面的也没关系。
3.1 基本概念
手机或者电脑用于处理图像渲染的硬件
一套图形与硬件接口,用于把处理好的图片显示到屏幕上。
是一个基于OpenGL ES 2.0图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜,内置120多种滤镜效果,并且能够自定义图像滤镜。
是一个基于OpenGL ES 2.0图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜,内置120多种滤镜效果,并且能够自定义图像滤镜。
就是把静态图片或者视频的每一帧进行图形变换再显示出来。它的本质就是像素点的坐标和颜色变化
3.1 利用GPUImage处理直播过程中美颜流程
3.2 处理画面原理
GPUImage采用链式方式来处理画面,通过addTarget:方法为链条添加每个环节的对象,处理完一个target,就会把上一个环节处理好的图像数据传递下一个target去处理,称为GPUImage处理链。 一般的target可以分为两类: 的target,一般是指各种filter,是GPUImageFilter或者是子类
的target,GPUImageView 用于显示到屏幕上或者GPUImageMovieWriter写成视频文件。
主要分为三个环节:
3.3 美颜原理
:本质就是让像素点模糊,可以使用高斯模糊,但是可能导致边缘会不清晰,用双边滤波(Bilateral Filter) ,有针对性的模糊像素点,能保证边缘不被模糊。
:本质就是提高亮度。
3.4 GPUImage源对象
GPUImage的数据源只能是4类:
ios摄像头的实时美颜。GPUImageVideoCamera是GPUImageOutput的子类,提供来自摄像头的图像数据作为源数据,一般是响应链的源头。
相机拍照
处理静止图像
电影
3.5 用法
创建过滤器创建源对象把过滤器添加到源对象生成target
静态图片处理:
实时美颜处理:
到这里,仅仅是屏幕显示的内容有滤镜效果,而作为直播类app开发,还需要输出带有美颜效果的视频流。 我们需要使用类,才能处理视频流。
核心思路:
通过GPUImageVideoCamera采集视频和音频信息,音频信息直接发送给,视频信息传入响应链作为源头,渲染后的视频再写入,同时通过显示在屏幕上。只需要就可以添加;
4. 音视频编码,解码
这一章太难了,以后再写。
VideoToolBox AudioToolBox 5. 流媒体服务器
国内外有很多好用的流媒体服务区。这里为了方便直播类app开发搭建我们采用搭建流媒体服务器。
5.1 MAC环境搭建
MACOS上搭建nginx+rtmp环境
5.2 Centos环境搭建
Centos下搭建的nginx + RTMP环境
5.3 服务端常用技术
直播数据上传到服务器后,观看直播的人比较多,服务器是承受不了的,会将数据分发到CDN,观众直接去CDN获取数据。减少服务器的负载。
由多台服务器组成一个服务器集群,每次请求的时候,会根据服务器负载选择处理请求的服务器。
6. 推流 6.1 推流协议的选择
HLS和RTMP
6.2 推流原理
在iOS设备上进行各推流的话,是通过AVCaptureSession这么一个捕捉会话,指定两个AVCaptureDevice 也就是iOS的摄像头和麦克风,获取个原始视频和音频,然后需要进行个H.264的视频编码和AAC的音频编码,再将编码后的数据整合成一个音视频包,通过rmtp推送到nginx服务器
6.3 librtmp
这个参考资料很少。不过大部分都采用的这个。 因为涉及太多C/C++这里不讨论。
7. 音视频播放 7.1 播放框架的选择
iOS的播放框架主要有以下三种:
AVPlayer 可以播放本地、远程视频,可以自定义UI进行控制AVPlayerViewController 自带播放控制UI,不能自定义UIMPMoviePlayerController,MPMoviePlayerViewController (iOS9后弃用)
如果直播类app开发只是实现简单的播放视频,选择,如果想自定义播放器,选择。
7.2 AVPlayer
AVPlayer是一个用来播放基于时间的流媒体控制对象。支持播放从本地、分布下载或通过HTTP Live Streaming协议得到的流媒体。 AVPlayer只管理一个单独资源的播放,不过框架还提供了AVPlayer的一个子类AVQueuePlayer,可以用来管理一个资源队列。当你需要在一个序列中播放多个条目或者为音频、视频资源设置播放循环时可以使用该子类。
AVPlayer视频播放使用步骤:
创建视频资源地址URL,可以是网络URL通过URL创建视频内容对象,一个视频对应一个创建视频播放对象,需要一个进行初始化创建播放图层对象,添加到现实视图上去添加KVO监听。 监听到AVPlayerItemStatusReadyToPlay的时候调用play方法
AVPlayer的使用
7.3 AVPlayerViewController
属于,它是,用于展示并控制AVPlayer实例的播放。
类使用步骤
创建URL创建AVPlayerViewController,并根据URL设置player属性调用play方法
AVPlayerViewController的使用
Xcode8模拟器可能有问题,打开播放不了。
8.开源框架
前面所讲都有第三方框架支持。采集、美颜、推流有, 拉流播放有。
LFLiveKit : LFLiveKit是iOS版开源RTMP流SDK。他支持后台录制、美颜功能、支持h264、AAC硬编码,动态改变速率,RTMP传输等
IJKMediaFramework : ijkplayer是B站开源的一款视频直播框架,它是基于ffmpeg。 如果从github下载是需要编译。
个人实验只需要配置Nginx+RTMP服务,这里我采用这两个第三方框架进行了直播类app开发,包含在线观看直播,和直播推流,支持在线美颜,前后摄像头切换等你需要:
搭建:MAC 或者 Centos下载项目真机运行。
声明:本文由云豹科技转发自程序员巴士博客,如有侵权请联系作者删除

海登海姆vs美因茨直播_海登海姆vs美因茨海登海姆vs美因茨免费直播在线直播

弗赖堡vsRB莱比锡直播_弗赖堡vsRB莱比锡直播观看免费_弗赖堡vsRB莱比锡

圣保利vs沃尔夫斯堡直播_圣保利vs沃尔夫斯堡免费高清在线直播_圣保利vs沃尔夫斯堡免费直播视频直播

法兰克福vs斯图加特直播_法兰克福vs斯图加特直播免费观看_法兰克福vs斯图加特直播无插件观看

勒沃库森vs汉堡直播_勒沃库森vs汉堡勒沃库森vs汉堡免费直播在线直播

拜仁vs科隆直播_拜仁vs科隆直播观看免费_拜仁vs科隆

云达不莱梅vs多特蒙德直播_云达不莱梅vs多特蒙德免费高清在线直播_云达不莱梅vs多特蒙德免费直播视频直播

维罗纳vs罗马直播_维罗纳vs罗马直播免费观看_维罗纳vs罗马直播无插件观看

拉齐奥vs切塞纳直播_拉齐奥vs切塞纳拉齐奥vs切塞纳免费直播在线直播

热那亚vs国米直播_热那亚vs国米直播观看免费_热那亚vs国米

05月25日 英超第38轮 曼城vs阿斯顿维拉 全场录像回放
2026年05月28日
05月25日 英超第38轮 水晶宫vs阿森纳 全场录像回放
2026年05月28日
05月25日 英超第38轮 桑德兰vs切尔西 全场录像回放
2026年05月28日
05月25日 英超第38轮 利物浦vs布伦特福德 全场录像回放
2026年05月28日
05月25日 英超第38轮 布莱顿vs曼联 全场录像回放
2026年05月28日
05月25日 英超第38轮 热刺vs埃弗顿 全场录像回放
2026年05月28日
05月18日 英超第37轮 纽卡斯尔联vsv西汉姆联 全场录像回放
2026年05月23日
05月17日 英超第37轮 利兹联vs布莱顿 全场录像回放
2026年05月23日
05月17日 英超第37轮 狼队vs富勒姆 全场录像回放
2026年05月23日
05月17日 英超第37轮 埃弗顿vs桑德兰 全场录像回放
2026年05月23日
05月17日 英超第37轮 布伦特福德vs水晶宫 全场录像回放
2026年05月23日
05月17日 英超第37轮 曼联vs诺丁汉森林 全场录像回放
2026年05月23日
05月16日 英超第37轮 阿斯顿维拉vs利物浦 全场录像回放
2026年05月23日
05月14日 英超第31轮补赛 曼城vs水晶宫 全场录像回放
2026年05月23日
05月12日 英超第36轮 热刺vs利兹联 全场录像回放
2026年05月23日
05月16日 德甲第34轮 柏林联合vs奥格斯堡 全场录像回放
2026年05月23日
05月16日 德甲第34轮 门兴vs霍芬海姆 全场录像回放
2026年05月23日
05月16日 德甲第34轮 海登海姆vs美因茨 全场录像回放
2026年05月23日
05月16日 德甲第34轮 弗赖堡vs莱比锡 全场录像回放
2026年05月23日
05月16日 德甲第34轮 圣保利vs沃尔夫斯堡 全场录像回放
2026年05月23日
05月16日 德甲第34轮 勒沃库森vs汉堡 全场录像回放
2026年05月23日
05月16日 德甲第34轮 法兰克福vs斯图加特 全场录像回放
2026年05月23日
05月17日 德甲第34轮 拜仁慕尼黑vs科隆 全场录像回放
2026年05月23日
05月11日 德甲第33轮 美因茨vs柏林联合 全场录像回放
2026年05月23日
05月10日 德甲第33轮 科隆vs海登海姆 全场录像回放
2026年05月23日
05月10日 德甲第33轮 汉堡vs弗赖堡 全场录像回放
2026年05月23日
05月10日 德甲第33轮 沃尔夫斯堡vs拜仁慕尼黑 全场录像回放
2026年05月23日
05月09日 德甲第33轮 霍芬海姆vs不莱梅 全场录像回放
2026年05月23日
05月18日 法甲第34轮 布雷斯特vs昂热 全场录像回放
2026年05月23日
05月14日 法甲第29轮补赛 朗斯vs巴黎圣日耳曼 全场录像回放
2026年05月23日
05月14日 法甲第29轮 布雷斯特vs斯特拉斯堡 全场录像回放
2026年05月23日
05月18日 法甲第34轮 斯特拉斯堡vs摩纳哥 全场录像回放
2026年05月23日
05月18日 法甲第34轮 马赛vs雷恩 全场录像回放
2026年05月23日
05月18日 法甲第34轮 洛里昂vs勒阿弗尔 全场录像回放
2026年05月23日
05月18日 法甲第34轮 巴黎FCvs巴黎圣日耳曼 全场录像回放
2026年05月23日
05月18日 法甲第34轮 里尔vs欧塞尔 全场录像回放
2026年05月23日
05月18日 法甲第34轮 尼斯vs梅斯 全场录像回放
2026年05月23日
05月11日 法甲第33轮 图卢兹vs里昂 全场录像回放
2026年05月23日
05月11日 法甲第33轮 雷恩vs巴黎FC 全场录像回放
2026年05月23日
05月11日 法甲第33轮 巴黎圣日耳曼vs布雷斯特 全场录像回放
2026年05月23日
05月11日 法甲第33轮 摩纳哥vs里尔 全场录像回放
2026年05月23日
05月11日 法甲第33轮 勒阿弗尔vs马赛 全场录像回放
2026年05月23日
05月11日 法甲第33轮 梅斯vs洛里昂 全场录像回放
2026年05月23日
05月24日 西甲第38轮 瓦伦西亚vs巴塞罗那 全场录像回放
2026年05月28日
05月24日 西甲第38轮 皇家马德里vs毕尔巴鄂竞技 全场录像回放
2026年05月28日
05月18日 西甲第37轮 塞维利亚vs皇家马德里 全场录像回放
2026年05月23日
05月18日 西甲第37轮 皇家社会vs瓦伦西亚 全场录像回放
2026年05月23日
05月18日 西甲第37轮 巴列卡诺vs比利亚雷亚尔 全场录像回放
2026年05月23日
05月18日 西甲第37轮 皇家奥维耶多vs阿拉维斯 全场录像回放
2026年05月23日
05月18日 西甲第37轮 奥萨苏纳vs西班牙人 全场录像回放
2026年05月23日
05月18日 西甲第37轮 马德里竞技vs赫罗纳 全场录像回放
2026年05月23日
05月18日 西甲第37轮 莱万特vs马略卡 全场录像回放
2026年05月23日
05月18日 西甲第37轮 毕尔巴鄂竞技vs塞尔塔 全场录像回放
2026年05月23日
05月15日 西甲第36轮 皇家马德里vs皇家奥维耶多 全场录像回放
2026年05月23日
05月15日 西甲第36轮 赫罗纳vs皇家社会 全场录像回放
2026年05月23日
05月15日 西甲第36轮 瓦伦西亚vs巴列卡诺 全场录像回放
2026年05月23日
05月14日 西甲第36轮 赫塔费vs马略卡 全场录像回放
2026年05月23日
05月14日 西甲第36轮 阿拉维斯vs巴塞罗那 全场录像回放
2026年05月23日
05月24日 意甲第38轮 博洛尼亚vs国际米兰 全场录像回放
2026年05月28日
05月25日 意甲第38轮 维罗纳vs罗马 全场录像回放
2026年05月28日
05月25日 意甲第38轮 都灵vs尤文图斯 全场录像回放
2026年05月28日
05月25日 意甲第38轮 AC米兰vs卡利亚里 全场录像回放
2026年05月28日
05月18日 意甲第37轮 萨索洛vs莱切 全场录像回放
2026年05月23日
05月18日 意甲第37轮 乌迪内斯vs克雷莫内塞 全场录像回放
2026年05月23日
05月18日 意甲第37轮 卡利亚里vs都灵 全场录像回放
2026年05月23日
05月18日 意甲第37轮 亚特兰大vs博洛尼亚 全场录像回放
2026年05月23日
05月17日 意甲第37轮 国际米兰vs维罗纳 全场录像回放
2026年05月23日
05月17日 意甲第37轮 罗马vs拉齐奥 全场录像回放
2026年05月23日
05月17日 意甲第37轮 比萨vs那不勒斯 全场录像回放
2026年05月23日
05月17日 意甲第37轮 尤文图斯vs佛罗伦萨 全场录像回放
2026年05月23日
05月17日 意甲第37轮 热那亚vsAC米兰 全场录像回放
2026年05月23日
05月12日 意甲第36轮 那不勒斯vs博洛尼亚 全场录像回放
2026年05月23日
05月11日 意甲第36轮 AC米兰vs亚特兰大 全场录像回放
2026年05月23日
06月09日 NBA总决赛G3 马刺vs尼克斯 全场录像回放
2026年06月11日
06月06日 NBA总决赛G2 尼克斯vs马刺 全场录像回放
2026年06月11日
06月04日 NBA总决赛G1 尼克斯vs马刺 全场录像回放
2026年06月11日
05月31日 NBA西部决赛G7 马刺vs雷霆 全场录像回放
2026年06月04日
05月30日 WNBA常规赛 菲尼克斯水星vs纽约自由人 全场录像回放
2026年06月04日
05月29日 NBA西部决赛G6 雷霆vs马刺 全场录像回放
2026年06月04日
05月27日 NBA西部决赛G5 马刺vs雷霆 全场录像回放
2026年05月28日
05月26日 NBA东部决赛G4 尼克斯vs骑士 全场录像回放
2026年05月28日
05月25日 NBA西部决赛G4 雷霆vs马刺 全场录像回放
2026年05月28日
05月25日 WNBA常规赛 达拉斯飞翼vs纽约自由人 全场录像回放
2026年05月28日
05月23日 NBA西部决赛G3 雷霆vs马刺 全场录像回放
2026年05月28日
05月24日 NBA东部决赛G3 尼克斯vs骑士 全场录像回放
2026年05月28日
05月22日 WNBA常规赛 金州女武神vs纽约自由人 全场录像回放
2026年05月23日
05月22日 NBA东部决赛G2 骑士vs尼克斯 全场录像回放
2026年05月23日
05月21日 NBA西部决赛G2 马刺vs雷霆 全场录像回放
2026年05月23日