资讯专栏INFORMATION COLUMN

视频直播技术之iOS端推流

Youngdze / 2543人阅读

摘要:网易云信推出一系列文章,对视频直播技术进行深入讲解,本篇文章将向大家介绍端的推流技术。目前视频的采集源主要来自摄像头采集屏幕录制从视频文件读取推流。音视频处理前处理模块也是主观影响主播观看效果最主要的环节。音视频发送推流使用的流媒体协议是。

随着网络基础建设的发展和资费的下降,在这个内容消费升级的时代,文字、图片无法满足人们对视觉的需求,因此视频直播应运而生。承载了实时性Real-Time和交互性的直播云服务是直播覆盖各行各业的新动力。网易云信推出一系列文章,对视频直播技术进行深入讲解,本篇文章将向大家介绍iOS端的推流技术。

相关阅读推荐
《短视频技术详解:Android端的短视频开发技术》

《视频直播:Windows中各类画面源的截取和合成方法总结》

《视频直播关键技术:流畅、拥塞和延时追赶》

直播架构
想必了解过直播的人都清楚直播主要分为3部分:推流->流媒体服务器->拉流。

而我们今天需要讲的就是推流这部分,它主要包括音视频采集,音视频前处理,音视频编码,推流和传输4个方面。但是由于网络的复杂性和大数据的统计,推流还需要有全局负载均衡调度GSLB(Global Server Load Balance),以及实时的统计数据上报服务器,包括提供频道管理给用户运营,因此推流SDK需要接入GSLB中心调度,统计服务器,心跳服务器,用于推流分配到网络最好的节点,有大数据的统计和分析。

下图涵盖了直播相关的所有服务,红色小标的线条代表指令流向,绿色小标的线条代表数据流向。

直播技术点

音视频采集
采集是所有环节中的第一环,我们使用的系统原生框架AVFoundation采集数据。通过iPhone摄像头(AVCaptureSession)采集视频数据,通过麦克风(AudioUnit)采集音频数据。目前视频的采集源主要来自摄像头采集、屏幕录制(ReplayKit)、从视频文件读取推流。

音视频都支持参数配置。音频可以设置采样率、声道数、帧大小、音频码率、是否使用外部采集、是否使用外部音频前处理;视频可以设置帧率、码率、分辨率、前后摄像头、摄像头采集方向、视频端显示比例、是否开启摄像头闪光灯、是否打开摄像头响应变焦、是否镜像前置摄像头预览、是否镜像前置摄像头编码、是否打开滤镜功能、滤镜类型、是否打开水印支持、是否打开QoS功能、是否输出RGB数据、是否使用外部视频采集。

音视频处理
前处理模块也是主观影响主播观看效果最主要的环节。目前iOS端比较知名的是GPUImage,提供了丰富的预处理效果,我们也在此基础上进行了封装开发。视频前处理包含滤镜、美颜、水印、涂鸦等功能,同时在人脸识别和特效方面接入了第三方厂商FaceU。SDK内置4款滤镜黑白、自然、粉嫩、怀旧;支持16:9裁剪;支持磨皮和美白(高斯模糊加边缘检测);支持静态水印,动态水印,涂鸦等功能。音频前处理则包括回声抑制、啸叫、增益控制等。音视频都支持外部前处理。

音视频编码
编码最主要的两个难点是:

1 处理硬件兼容性问题

2 在高FPS、低bitrate和音质画质之间找个一个平衡点

由于iOS端硬件兼容性比较好,因此可以采用硬编。SDK目前支持软件编码openH264,硬件编码VideoToolbox。而音频支持软件编码FDK-AAC和硬件编码AudioToolbox。

视频编码的核心思想就是去除冗余信息:

空间冗余:图像相邻像素之间有较强的相关性。

时间冗余:视频序列的相邻图像之间内容相似。

编码冗余:不同像素值出现的概率不同。

视觉冗余:人的视觉系统对某些细节不敏感。

音视频发送
推流SDK使用的流媒体协议是RTMP(RealTime Messaging Protocol)。而音视频发送最困难的就是针对网络的带宽评估。由于从直播端到RTMP服务器的网络情况复杂,尤其是在3G和带宽较差的Wifi环境下,网络丢包、抖动和延迟经常发生,导致直播推流不畅。RTMP基于TCP进行传输,TCP自身实现了网络拥塞下的处理,内部的机制较为复杂,而且对开发者不可见,开发者无法根据TCP协议的信息判断当时的网络情况,导致发送码率大于实际网络带宽,造成比较严重的网络拥塞。因此我们自研开发了一款实时根据网络变化的QoS算法,用于实时调节码率、帧率、分辨率,同时将数据实时上报统计平台。

模块设计&线程模型
模块设计
鉴于推流的主流程分为上述描述的4个部分:音视频采集、音视频前处理、音视频编码、音视频发送。因此将推流SDK进行模块划分为LSMediacapture层(对外API+服务器交互)、视频融合模块(视频采集+视频前处理)、音频融合模块(音频采集+音频前处理)、基础服务模块、音视频编码模块、网络发送模块。

线程模型
推流SDK总共含有10个线程。视频包含AVCaptureSession的原始采集线程、前处理线程、硬件编码线程、数据流向定义的采集线程、编码线程、发送线程。音频包含AudioUnit包含的原始采集线程、数据流向定义的采集线程、编码线程、发送线程。在数据流向定义的采集线程、编码线程、发送线程之间会创建2个bufferQueue,用于缓存音视频数据。采集编码队列可以有效的控制编码码率,编码发送队列可以有效自适应网络推流。

QoS&跳帧
下图是直播的主要流程,用户初始化SDK,创建线程,开始直播,音视频数据采集,编码,发送。在发送线程下,音视频数据发送,QoS开启,根据网络实时评估带宽,调整帧率,码率控制编码器参数,同时触发跳帧,调整分辨率控制采集分辨率参数。用户停止直播,反初始化SDK,销毁线程。QoS&跳帧可以有效的解决用户在网络不好的情况下,直播卡顿的问题。在不同的码率和分辨率情况下,都能够做到让用户流畅地观看视频直播。

以上就是iOS端推流技术的详细讲解。

另外,想要阅读更多关于视频直播技术的文章,可以移步网易云信博客。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/34751.html

相关文章

  • 视频直播技术:最大限度保障流畅性和清晰度

    摘要:针对上述问题,本文介绍了网易云信直播的网络技术,旨在帮助读者了解在极差网络环境下如何最大限度的保障直播的流畅性和清晰度。以上简单介绍了直播中提高流畅性和清晰度的几种方法和策略。另外,想要获取更多产品干货技术干货,记得关注网易云信博客。 直播和互动直播在2017年引起了人们的极大关注,应运而生的各种直播类APP多如牛毛。随着互动直播的逐渐兴起,交互成为直播APP的强需求。然而,实际网络中...

    Paul_King 评论0 收藏0
  • 全栈开发——动手打造属于自己的直播间(Vue+SpringBoot+Nginx)

    摘要:经过琢磨,其实是要考虑安全性的。具体在以下几个方面跨域连接协议升级前握手拦截器消息信道拦截器对于跨域问题,我们可以通过方法来设置可连接的域名,防止跨站连接。 前言 大学的学习时光临近尾声,感叹时光匆匆,三年一晃而过。同学们都忙着找工作,我也在这里抛一份简历吧,欢迎各位老板和猎手诚邀。我们进入正题。直播行业是当前火热的行业,谁都想从中分得一杯羹,直播养活了一大批人,一个平台主播粗略估计就...

    e10101 评论0 收藏0
  • 全栈开发——动手打造属于自己的直播间(Vue+SpringBoot+Nginx)

    摘要:经过琢磨,其实是要考虑安全性的。具体在以下几个方面跨域连接协议升级前握手拦截器消息信道拦截器对于跨域问题,我们可以通过方法来设置可连接的域名,防止跨站连接。 前言 大学的学习时光临近尾声,感叹时光匆匆,三年一晃而过。同学们都忙着找工作,我也在这里抛一份简历吧,欢迎各位老板和猎手诚邀。我们进入正题。直播行业是当前火热的行业,谁都想从中分得一杯羹,直播养活了一大批人,一个平台主播粗略估计就...

    JerryZou 评论0 收藏0
  • 基于 Vue 的直播播放器实战

    摘要:直播协议首先,需要知道直播的常用协议,和,经过测试在七牛云直播平台不采用加速的情况下的延时在内,在。 showImg(https://segmentfault.com/img/bVFwFZ?w=2328&h=764); 前言 时下直播的盛行让很多人对直播技术产生浓厚的兴趣,orange 本人也不例外,本文借着实战的目的完成一个 demo,并没有深入的讲解直播技术的实现原理以及推流和拉流...

    xcc3641 评论0 收藏0
  • 【腾讯Bugly干货分享】从0到1打造直播 App

    摘要:流媒体服务器端用来接受视频录制端提供的视频源,同时提供给视频播放端流服务。支持该协议即,是由苹果提出基于的流媒体传输协议。更多配置可以参考下面是的配置文件腾讯云直播后台主要是调用腾讯云。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:李智文 概要 分享内容: 互联网内容载体变迁历程,文字——...

    Ku_Andrew 评论0 收藏0

发表评论

0条评论

Youngdze

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<