斗鱼直播带你实现:你主播最爱的Android音视频开发
一、直播的本质
实时推送/拉取音视频数据
二、视频直播流程
视频直播的流程可以分为如下几步:
(1)采集
(2)处理
(3)编码和封装
(4)推流到服务器
(5)服务器流分发
(6)播放器流播放
1、采集
视频的采集涉及两方面数据的采集:音频采集和图像采集,它们分别对应两种完全不同的输入源和数据格式。
(1)两个传感器:
CCD:图像传感器,用于图像采集和处理,把图像转换为电信号
拾音器:声音传感器,用于声音采集和处理,把声音转换为电信号
(2)格式:
视频采样数据 : 一般都是 YUV 或 RGB 格式
音频采样数据 :一般都是PCM格式
由于所采集的内容非常大,所以需要进行压缩。常见的音频压缩格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。视频编码压缩成 H.264 等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
2、处理
视频或者音频完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理,例如:美颜及水印。各种美颜和视频添加特效的App都是基于GPUImage框架实现。
3、编码和封装
视频编码的意义:原始视频数据存储空间大。核心思想就是去除冗余信息。
常见的视频编码器:
(1)H.264/AVC
(2)HEVC/H.265
(3)VP8
(4)VP9
(5)FFmpeg :是一个跨平台的开源视频框架,能实现如视频编码,解码,转码,串流,播放等丰富的功能。其支持的视频格式以及播放协议非常丰富,几乎包含了所有音视频编解码、封装格式以及播放协议。
封装:是把编码器生成的多媒体内容(视频,音频,字幕,章节信息等)混合封装在一起的标准。
常见的封装格式:
(1)AVI 格式(后缀为 .avi)
(2)DV-AVI 格式(后缀为 .avi)
(3)QuickTime File Format 格式(后缀为 .mov)
(4)MPEG 格式(文件后缀可以是 .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4等)
(5)WMV 格式(后缀为.wmv .asf)
(6)Real Video 格式(后缀为 .rm .rmvb)
(7)Flash Video 格式(后缀为 .flv)
(8)Matroska 格式(后缀为 .mkv)
(9)MPEG2-TS 格式 (后缀为 .ts)
4、推流
传输协议:
RTMP :实时消息传输协议,Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议,因为是开放协议所以都可以使用了。 RTMP协议用于对象、视频、音频的传输。
HLS(HTTP Live Streaming):是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议
RTSP(Real Time Streaming Protocol):实时流传送协议,是用来控制声音或影像的多媒体串流协议, 由Real Networks和Netscape共同提出的
最后
最近也有重新整理了相关的音视频这一块的精华视频,感兴趣的可以关注关注。
最后我在这里分享一下这段时间从朋友,大佬那里收集到的一些2019-2020BAT 面试真题解析,里面内容很多也很系统,包含了很多内容:Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题
等等,可以很好地帮助我们深刻理解Android相关知识点的原理以及面试相关知识。
这份资料把大厂面试中常被问到的技术点整理成了 PDF ,包知识脉络 + 诸多细节;还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
这里也分享给广大面试同胞们,希望每位程序猿们都能面试成功~
以上内容均放在了开源项目:我的github 中已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新中...
- Spring boot with Thymeleaf
- 零基础学编程014:小海龟做画
- Springboot @RequestBody 传递 List
- 零基础学编程013:import让你飞起来
- 【教程】利用Tensorflow目标检测API确定图像中目标的位置
- 零基础学编程012:画出复利曲线图
- OpenAI发布高度优化的GPU计算内核—块稀疏GPU内核
- SQL SERVER 原来还可以这样玩 FOR XML PATH
- 零基础学编程011:复利数据表问题(总结)
- 一个小程序引发的思考
- 深入内核:DUMP Block的数据读取与脏数据写入影响
- 零基础学编程010:最终可以输出完整的复利数据表了
- 在C#使用文件监控对象FileSystemWatcher 实现数据同步
- 零基础学编程018:条件语句
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释