直播系统开发之推流及拉流概述

简介: 直播系统开发推流端会根据当前上行网络情况控制音视频数据发包和编码,在网络较差的情况下,音视频数据发送不出去,造成数据滞留在本地,这时,会停掉编码器防止发送数据进一步滞留,同时会根据网络情况选择合适的策略控制音视频发送。

拉流(播放):
根据直播系统开发协议类型(如RTMP、RTP、RTSP、HTTP等),与服务器建立连接并接收数据;

解析二进制数据,从中找到相关流信息;

根据不同的封装格式(如FLV、TS)解复用(demux);

分别得到已编码的H.264视频数据和AAC音频数据;

使用硬解码(对应系统的API)或软解码(FFMpeg)来解压音视频数据;

经过解码后得到原始的视频数据(YUV)和音频数据(AAC);

因为音频和视频解码是分开的,所以我们得把它们同步起来,否则会出现音视频不同步的现象,比如别人说话会跟口型对不上;

最后把同步的音频数据送到耳机或外放,视频数据送到屏幕上显示。

了解了直播系统开发播放器的播放流程后,我们可以优化以下几点:

首屏时间优化

从步骤2入手,通过预设解码器类型,省去探测文件类型时间;

从步骤5入手,缩小视频数据探测范围,同时也意味着减少了需要下载的数据量,特别是在网络不好的时候,减少下载的数据量能为启动播放节省大量的时间,当检测到I帧数据后就立马返回并进入解码环节。

推流:

推流.jpg

经过输出设备(AVCaptureVideoDataOutput)得到原始的采样数据--视频数据(YUV)和音频数据(AAC);

使用硬编码(对应系统的API)或软编码(FFMpeg)来编码压缩音视频数据;

分别得到已编码的H.264视频数据和AAC音频数据;

根据不同的封装格式(如FLV、TS、MPEG-TS);

使用HLS协议的时候加上这一步(HLS分段生成策略及m3u8索引文件)

通过流上传到服务器;

服务器进行相关协议的分发

推流步骤说明:很容易看出推流跟播放其实是逆向的,具体流程就不多说了。

优化一:适当的Qos(Quality of Service,服务质量)策略。
直播系统开发推流端会根据当前上行网络情况控制音视频数据发包和编码,在网络较差的情况下,音视频数据发送不出去,造成数据滞留在本地,这时,会停掉编码器防止发送数据进一步滞留,同时会根据网络情况选择合适的策略控制音视频发送。

比如网络很差的情况下,推流端会优先发送音频数据,保证用户能听到声音,并在一定间隔内发关键帧数据,保证用户在一定时间间隔之后能看到一些画面的变化。

优化二:合理的关键帧配置。
合理控制直播系统开发关键帧发送间隔(建议2秒或1秒一个),这样可以减少后端处理过程,为后端的缓冲区设置更小创造条件。

软硬编解选择

网上有不少关于选择软解还是硬解的分析文章,这里也介绍一些经验,但根本问题是,没有一个通用方案能最优适配所有操作系统和机型。

推流编码: 推荐Andorid4.3(API18)或以上使用硬编,以下版本使用软编;iOS使用全硬编方案;

播放解码:Andorid、iOS播放器都使用软解码方案,经过我们和大量客户的测试以及总结,虽然牺牲了功耗,但是在部分细节方面表现会较优,且可控性强,兼容性也强,出错情况少,推荐使用。

附软硬编解码优缺点对比:

硬编码软编码优缺点.jpg

采集
采集的步骤:

创建AVCaptureSession
输入对象AVCaptureDeviceInput
输出对象AVCaptureVideoDataOutput
输出代理方法captureOutput(_:didOutputSampleBuffer:fromConnection:)
相关内容
采集数据:iOS平台上采集直播系统开发音视频数据,需要使用AVFoundation.Framework框架,从captureSession会话的回调中获取音频,视频数据。
传输层协议:主要采用RTMP协议居多(默认端口1935,采用TCP协议),也有部分使用HLS协议
音/视频编码解码:FFMpege编码解码
视频编码格式:H.265、H.264、MPEG-4等,封装容器有TS、MKV、AVI、MP4等
音频编码格式:G.711μ、AAC、Opus等,封装有MP3、OGG、AAC等
渲染工具:采用OpenGL渲染YUV数据,呈现视频画面。将PCM送入设备的硬件资源播放,产生声音。iOS播放流式音频,使用Audio Queue 的方式,即,利用AudioToolbox.Framework 框架。

本文转自https://blog.csdn.net/yanceyxin/article/details/82750686?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160067980719724848356004%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160067980719724848356004&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-1-82750686.pc_first_rank_v2_rank_v28&utm_term=%E6%8E%A8%E6%B5%81&spm=1018.2118.3001.4187

仅作分享用。

相关文章
|
20天前
|
Web App开发 网络协议 算法
WebRTC 和一些常见的直播方案
【10月更文挑战第25天】
|
3月前
|
编解码 Linux 开发工具
大牛直播SDK跨平台RTMP直播推送模块技术设计和功能列表
大牛直播SDK是一款跨平台RTMP直播推送模块,支持Windows、Linux(x64_64与aarch64架构)、Android及iOS平台。该SDK功能全面,包括摄像头、屏幕、麦克风等数据采集与推送,并支持编码前后数据对接。其架构设计优秀,确保低延迟与高效率,结合SmartPlayer播放器实现毫秒级延迟体验。具备全自研框架,易于扩展且支持多种数据源接入,如外部YUV/RGB/H.264等格式。此外,各平台支持特性丰富,如Windows平台支持多摄像头合成,Android与iOS平台支持前后摄像头实时切换等。大牛直播SDK还提供了多个示例项目以帮助开发者快速上手。
|
视频直播
视频直播源码技术知识分享:连麦功能(一)
我们开发视频直播平台就要去了解视频直播开发相关功能知识,这对我们开发平台有着重要的作用,连麦技术就是视频直播源码重要的技术功能之一,每一个功能技术都有自己的用武之地
视频直播源码技术知识分享:连麦功能(一)
|
视频直播
详解!视频直播源码平台搭建开发:录制功能
视频直播源码平台的录制功能能够为用户提供更多方便、灵活性,同时也增加了直播内容的传播和价值,这也使录制功能成为布谷科技视频直播源码平台的必备功能之一。
详解!视频直播源码平台搭建开发:录制功能
|
编解码 JSON 数据格式
实现在线直播源码高质量直播体验重要功能
在线直播源码平台中会出现各种各样问题,而应对这些问题,在线直播源码平台又开发出不同的功能,云端混流转码就是其中重要功能之一,它为平台带来了很大的优势。
直播平台源码功能分享:直播回放功能的实现
这个直播平台源码功能可以将主播的直播内容录制下来保存在直播平台云端中,用户进入到主播首页就可以看到这个直播平台源码功能,点击后就可以播放主播以往储存的直播内容。
直播平台源码功能分享:直播回放功能的实现
|
API 数据安全/隐私保护
直播源码平台搭建技术分享之直播短信功能实现
在利用直播源码去开发平台中,直播源码功能技术是开发直播平台的重要技术之一,今天我就为大家分享直播源码平台搭建技术分享直播短信功能实现。
直播源码平台搭建技术分享之直播短信功能实现
|
数据采集 编解码 搜索推荐
短视频直播系统,如何实现高质量直播场景
短视频直播系统,如何实现高质量直播场景
一对一直播app开发,分析一下直播实现的流程
网络速度的提升,就可以支持高清视频的传输,并且传输速度大大提升,对优化画质和降低延迟都非常有帮助。一对一直播app开发技术的发展,对优化系统和提升用户体验,具有很强的推动力。
|
存储 编解码 人工智能
产品百科 |直播转点播最佳实践
直播转点播(直转点)是将直播流同步录制为点播视频,并支持媒资管理、媒体处理(转码及内容审核 / 智能首图等 AI 处理)、内容制作(云剪辑)、CDN 分发加速等一系列操作,可配置工作流自动处理,也可通过 API/SDK 灵活触发。
产品百科 |直播转点播最佳实践
下一篇
无影云桌面