直播-拉流和推流概述 转载

拉流(播放):

根据协议类型(如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

采集

采集的步骤:

  1. 创建AVCaptureSession
  2. 输入对象AVCaptureDeviceInput
  3. 输出对象AVCaptureVideoDataOutput
  4. 输出代理方法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 框架。

文/狂人日记_wd(简书作者)
原文链接:http://www.jianshu.com/p/b520c2a9b795
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

时间: 2024-10-19 19:32:22

直播-拉流和推流概述 转载的相关文章

IJKPlayer集成直播拉流播放

iOS端集成ijkplayer实现直播播放 前言 ijkplayer框架是专门用来做 视频直播 的开源框架,基于ffmpeg,同时支持 Android 和 iOS 平台. 对于 App 中的直播功能,如果我们成功集成ijkplayer ,那么就算完成一半的工程了.接下来,只要获取到 拉流 URL,就能实现视频直播功能了. 但是初次集成这个框架,对于新手还是有一定难度的. 本篇主要介绍如何快速集成 ijkplayer 框架. 最终效果.gif 一.下载 ijkplayer 1.下载 ijkplay

推流和拉流的概念以及RTMP和HLS协议

https://www.bbsmax.com/A/x9J2wZM56o/ 推流为将直播内容推送至服务器的过程:拉流为服务器已有直播内容,用指定地址进行拉取的过程. rtmp rtmp是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种.RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进

绝对独创---关于直播(推流-拉流-服务器搭建)

1.公司有风声要做直播,赶好这段有时间,自己研究了一下.其实走过的弯路比较多,后来在拉流/推流/服务器搭建都完成之后,思路变得很清晰. 2.首先从服务器搭建说起,关于三种主流的HLS/RTMP/FLV,这里我使用的是RTMP,关于其中的切换,我们需要看一下ngnix的配置文件的相关参数文档. 我使用的是ngnix+rtmp,也就是本地搭建ngnix服务器,另外在ngnix服务器上添加了rtmp的模块.闭门造车容易猝死,我参考的是简书上的,请移步:http://www.jianshu.com/p/

【转】直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit

原:https://www.cnblogs.com/baitongtong/p/11248966.html 1 .音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD.CMOS拾音器:声电转换装置(咪头).音频放大电路2.数据编码:使用相关硬件或软件对音视频原始数据进行编码处理(数字化)及加工(如音视频混合.打包封装等),得到可用的音视频数据涉及技术或协议:编码

直播推流之blibli和拉流LFLiveKit

执行上面操作后,导入合成的拉流blibli包到工程中,然后新建个播放控制器来设置播放 1.  播放的一些操作. 2. 高斯模糊. 3. 新建聊天控制器. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. [self initPlayer];//添加播放器 [self loadUI]; //添加高斯模糊 [self loadChatVC

iOS简单直播实现(三:IJKMediaFramework拉流)

推流完成后,需要拉流才能进行完整的直播.拉流我们采用的也是一个开源的第三方库IJKMediaFramework. 这个库本质是一个播放器,能播放flv格式的播放器.用起来和ios自带的AVPlayer很相似. 实现功能:1.拉流播放.2.监听. 一.创建占位图和卡顿占位动效,代码如下: //直播前的占位图片- (UIImageView *)placeHolderView { if (!_placeHolderView) { _placeHolderView = [[UIImageView all

直播系统推拉流端技术

想要搭建网络视频直播系统就要明白视频直播的过程是什么样的,而直播流程可以分为采集.前处理.压缩编码.推流.拉流.解码.渲染播放这几个环节,其中涉及到推流端.拉流端和服务器三端的知识点,服务器方面的知识点很多,拓幻科技这里先简单说下推流端和拉流端的一些知识点,服务器方面可以先看我以前写的文章. 一. 推流端的四个环节1. 首先是采集环节:采集是指对图像和声音的采集,简单说就是能让网络视频直播系统和主播摄像头连起来,软件能获取到外界的音视频信息.然后是前处理阶段:这里也是俗称美颜的阶段,这要求我们在

直播系统搭建:拉流端的三个环节及服务器部署重点

拉流端的三个环节 1. 用户想看直播就要去服务器进行拉流,什么是拉流?你打开视频网站,点击视频,你点击视频和视频打开之间的时间段,就是你的客户端去向服务器请求拉流了,这一步要注意的是首屏开启时间,时间越短,观众越有可能被留下. 2. 有编码就要有解码,编码上会出现安卓适配问题,那解码上当然也会出现该问题,网络视频直播系统自带编解码程序的优势就在于它能够避免因手机机型不同,视频格式不同而产生的不同机型无法播放的情况. 3. 渲染环节交给手机就可以了,播放之后用户就可以进行观看了. 直播系统源码搭建

FFmpeg总结(十二)用ffmpeg与nginx实现直播多路流并发播放

下载 nginx 和 nginx-rtmp源码: http://nginx.org/download/nginx-1.5.10.tar.gz https://github.com/arut/nginx-rtmp-module/archive/master.zip 编译安装: cd nginx-1.5.10 ./configure –with-http_ssl_module –add-module=../nginx-rtmp-module-master make make install 浏览器输