第二十三篇玩转【斗鱼直播APP】系列之直播总体概览_kidd风的博客-程序员秘密

技术标签: 转载  

直播总体概览

概述

  • 直播的现状
    • 2016年,是一个直播年。直播行业快速发展,同时也滋生了大大小小上千家相关的公司。
    • 中国互联网络信息中心发布的报告显示,截至今年6月,我国网络直播用户规模达到3.25亿,占网民总体的45.8%。
  • 直播的技术
    • 直播技术概况来说,可以分为 采集,前处理,编码,传输,解码,渲染 这几个环节

技术整体概览

  • 图例:

分步解析

音视频采集

  • 音视频的采集是直播架构的第一个环节,也是直播的视频来源
  • 采集的来源包括:
    • PC端:屏幕摄像头(摄像头驱动适配)
    • iOS端:摄像头采集(屏幕采集?)
    • Android端:屏幕摄像头采集(硬件过多,适配一堆坑)

前处理

  • 使用美颜相机&美图秀秀已经是网络发照片&发视频必备技能了
    • 80%的主播没有美颜简直不能看(当然还是有美女的)
    • 不能看如何吸引用户&观众
    • 对视频进行美颜,已成标配
  • 处理主要包括,美颜、模糊效果、水印等
    • 总之就是让人变美、变帅
  • 各个平台处理方式
    • PC端:美颜镜头、一些美颜软件
    • iOS端:图像处理库是GPUImage,提供了丰富的预处理效果,也可利用该库自定义设计
    • Android端:Google开源的grafika,是一个非常强大的图形处理库

编码

  • 不经编码的视频非常庞大,存储起来都麻烦,更何况网络传输
    • 编码通过压缩音视频数据来减少数据体积,方便音视频数据的推流,拉流和存储,能大大提高存储传输效率
    • 音视频必须经过压缩编码才能进行存储和传输
  • 编码方式:
    • 硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP芯片等
    • 软编码:使用CPU进行编码(手机容易发热)
  • 各个平台处理:
    • iOS端:硬件兼容性较好,可以直接进行硬编码
    • Android端:硬编码较难,难找到统一的库兼容各个平台(推荐使用软编)
  • 编码标准:
    • 视频编码:H.265、H.264、VP8、VP9等
    • 音频编码:AAC、Opus

传输

  • 从推流端到服务端
    • 数据经过推流端采集和预处理,编码之后推流到服务端
    • 流传输就涉及到相应的传输协议,最常用的协议是RTMP、RTSP、HLS
  • 搭建nginx+rtmp服务器进行推流演示

流分发

  • 音频流推到服务器后,为了适配各个平台端各种不同协议,需要在服务端做一些流处理工作,比如转码成不同格式支持不同协议如 RTMP、HLS 和 FLV,以适应各个平台
    • 比如:iOS、Android、PC、网页
  • 甚至,为了配合一些运营需求,比如一些监管部门的要求,我们在服务端也提供了内容识别如鉴黄的功能

播放

  • 拉流获取音视频数据后,需要通过解码器解码,渲染才能在播放器上播放
  • 总体步骤概览:
    • 解协议:取出网络传输过程中一些无用信息
    • 解封装:获取到的是音频&视频放在一起的封装文件
    • 音视频解码:音视频都是经过压缩编码的内容,解码后才能进行播放
    • 音视频同步:视频&音频文件需要通过播放
    • 音视频播放:声卡&显卡等对音视频进行播放
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hmh007/article/details/52908849

智能推荐

[Android初级]android与netty4初体验_wowo_小白的博客-程序员秘密_android netty4

博主曾经对netty4的helloword很感兴趣,也曾单纯的写过一个小小的聊天室java代码,现在重新来看看,浏览了这位牛人的博客 点击去看看    我觉得受益匪浅,故拿来分享。      这次是在android上使用netty作为客户端,来与服务端相互通讯的小事例,纯粹的helloworld,效果就是在android程序中发送一个消息到服务端,然后服务端也回一个消息给客户端,很简单的d

SSM框架学习笔记(一)MD5加密_reason.的博客-程序员秘密

目录1. 密码需要md5加密并进行撒盐处理的原因2. 添加依赖3. 封装md5加密方法4. 测试方法1. 密码需要md5加密并进行撒盐处理的原因由于用户写的密码过于简单,有些网站可以进行破译,所以要对明文进行撒盐处理2. 添加依赖 <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> &

python读取/写入文件_weixin_30586257的博客-程序员秘密

《Python编程:从入门到实践》读书笔记1.读取文件并且对文件内容进行打印有三种方式:with open('test.txt') as fo: for lins in fo: print(lins.rstrip()) with open('test.txt') as fo: lines=fo.read() print(...

Visual Studio 2017配置opencv_qq_42694575的博客-程序员秘密

因为要用到opencv,所以没办法只能配置了,我现在用的是Visual Studio 2017,opencv的版本我装的也是最新的4.0版本,以下的配置方法,其他版本的也适用。第一步:要配置opencv,首先要去官网把安装包下载下来,这里附上网址https://opencv.org/releases.html#下载会需要一点时间,请大家耐心等待哈。下载完之后应该显示的是一个exe执行文件...

Linux内核中printk与日志级别_do2jiang的博客-程序员秘密

     函数printk的使用方法和printf相似,用于内核打印消息。printk根据日志级别(loglevel)对消息进行分类。日志级别用宏定义,日志级别宏展开为一个字符串,在编译时由预处理器将它和消息文本拼接成一个字符串,因此printk 函数中日志级别宏和格式字符串间不能有逗号。   下面是两个printk的例子,一个用于打印调试信息,另一个用于打印临界条件信息。

翻翻git之---效果鲜明的类ViewPager库 ConvenientBanner(对图片加载部分进行修改)_王亟亟的博客-程序员秘密

转载请注明出处:王亟亟的大牛之路昨天写了篇基础的View绘制的内容貌似观众老爷们不怎么喜欢,那再这里再安利下自定义View时,用到Paint Canvas的一些温故,讲讲用路径绘画实现动画效果(基础篇 三)ViewPager相比大家都用烂了,实现也有多种多样,那为什么我又要贴这篇呢?第一,表明态度,跟陈旧的universal-image-loader说再见第二,确实内容写得不错先来看下效果图:这是默

随便推点

Python 学习入门(3)—— 常用类库_阳光岛主的博客-程序员秘密

常用的自带类库常用的外部类库:Tkinter———— Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对 Tk API的接口,它属于Tcl/Tk的GUI工具组。Tcl/Tk是由John Ousterhout发展的书写和图形设备。Tcl(工具命令语言)是个宏语言,用于简化shell下复杂程序的开发,Tk工具包是和Tcl一起开发的,目的是为了简化

大数据Flink_dagejun的博客-程序员秘密

Flink学习Flink是什么基于数据流的有状态的计算,分布式处理引擎框架,作用于有无界有界的数据流上。无界流:有头没有尾,源源不断,无穷无尽。不可能等待所有数据结束才去处理。有界流:有始有终,可以等待所有数据都准备好了才去处理,可以理解为批处理。Flik应用程序可以处理数据来了就处理,还可以先把数据存下来再处理。分层接口API越往下级别越高,但表达能力越低Stateful Event-Driven Application,底层使用ProcessFunction,需要实现它提供的方法St

数据结构~05.双链表的操作,手写Java语言中的LinkedList集合_算法爱好者丶的博客-程序员秘密

数据结构学习~05.双链表的操作,手写LinkedList集合本文是上一篇文章的后续,详情点击该链接~先写一个普通的双链表插入和遍历~#include<stdio.h>#include<stdlib.h>typedef struct no_de { int data; //data中存放数据域 struct no_de* pre; //指向前驱结点的指针 struct no_de* next; //指向后继结点的指针}Node;//建立头节点Node*

文字横向滚动的实现_goodboyws的博客-程序员秘密

文字横向滚动的关键在于在计时器里递增文字位置的偏移并重绘,还要处理边界和循环绘制的效果,下面是一个基于CStatic的文字横向滚动的例子void  CMyStatic::OnTimer(UINT  nIDEvent)    {             //  TODO:  Add  your  message  handler  code  here  and/or  call  default

Bootstrap-table表格初始化表格数据_weixin_30328063的博客-程序员秘密

一、项目说明  ①此项目是ASP.NET项目,开发语言是C#  ②bootstrap-table使用需要下载对应的css和js插件  ③具体详情还需查看api文档二、前端代码1 <div class="table-responsive">2 <table id="table" class="text-nowrap"> &lt...

Java程序操作数据库SQLserver详解_weixin_33810006的博客-程序员秘密

数据库基本操作:增删改查(CRUD)crud介绍(增、删、改、查操作) CRUD是指在做计算处理时的增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单记事的首字母简写。主要被用在描述软件系统中数据库或者持久层的基本操作功能。Create new recordsRctricvc cxisting rccor...