本文涉及内容
参考链接
音视频处理课程-B站
FFmpeg API 使用指南:基础编解码、封装解封装
一、 相关技术名词
流媒体
一种具备边传边播特点的多媒体,核心为流式传输技术,也被称为新的媒体传送方式。
不必等到把媒体全部下载完毕,只需要将视音频文件经过压缩处理, 放在媒体服务器上, 在网络中使用流式传输技术分段传送,大概几秒的延时就可以获取到媒体服务器推送的视频数据。
流媒体的出现节省了下载时间和存储空间, 使延时大大减少,极大地方便了人们的工作和生活。
CDN------Content Delivery Network,内容分发网络
将内容缓存在终端用户附近 缓存分发
什么是CDN-知乎
nginx 反向代理
服务器端的代理服务器 实现高并发下的负载均衡
Nginx详解-CSDN
SRS
SRS(Simple Realtime Server)是一个简单高效的实时视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT等多种实时流媒体协议.SRS Stack是一个一体化、开箱即用、开源的视频解决方案,可部署在云上或自建机房,以直播和WebRTC等能力赋能你的业务。
- SRS是音视频数据的中转站,数据只在内存中循环覆盖,不会写入磁盘
- 支持监控行业的GB28181协议
- 用于LiveStreaming 直播 和 RTC 实时通信
YUV
YUV的两种格式:
- packed格式 YUVYUVYUV
- planar格式 YYYUUUVVV
YUV的软硬编码: - 硬编码:NV12
- 软编码:YUV420P
YUV 4:4:4 采样 每一个Y对应一组UV分量
YUV 4:2:2 采样 每两个Y对应一组UV分量
YUV 4:2:0 采样 每四个Y对应一组UV分量
YUV最终需要转成RGB显示
- 解码异常显示绿色的原因:YUV各分量值为0, 计算后为绿色
二、视频录制基础流程
模拟信号到数字信号
采集 编码 封装
音频 PCM MP3/AAC
摄像头 RGB/YUV H264
封装 MP4 FLV
推拉流 RTSP RTMP HTTP-FLV WebRTC
数字信号到模拟信号
一些区分
转码和转封装
转封装 不需要处理音视频数据,只是换一种组合方式
转码 需要对音视频进行处理
解封装 将一个个音视频数据块从流中解出来
封装格式和推拉流传输协议
RTMP、HLS、HTTP-FLV 这些是网络传输协议 基于UDP或TCP 用于推流
MP4、flv这种是封装格式,用于封装
三、编码格式
视频编码格式
H264码流介绍 及 FFmpeg解封装得到H264码流方法-3ms
音频编码格式
-
AAC-LC的一些限制
- 采样率:8KHz-96KHz
- 音频帧采样个数:1024
- 码率:根据具体采样率也有对应的限制
-
AAC的一些规格:
- AAC-LC:最基础的AAC规格,最常用的规格 兼容性好,特别是对老设备
- AAC-HE:包含SBR(Spectral Band Replocation频段复制)技术,SBR技术能让低码率下音质更优秀
低码率下(128Kbps),音质更优秀 - AAC-HE v2:包含SBR、PS(Parametric Stereo 参数立体声)技术,PS技术能让多个声道数据压缩更高效
包含AAC-HE优点,立体声数据压缩效率高 - 128Kbps码率以上,三种规格无明显区别
-
无损音质要求,可选择PCM等编码格式
四、封装格式
封装格式的作用
音频数据,视频数据,基础信息等数据,按照一定的规则编排成文件
MKV的封装格式:支持外接字幕,可切换不同语言字幕
在线播放视频的场景下FLV、HLS会比MP4,在首帧播放所需时间,未加载完跳转等方面表现更优秀
1. MP4
- 最常见的封装格式
- MP4支持在线播放
http://xxx/xxx.mp4
- 应用范围广,灵活性高,兼容性强
几乎所有的播放器甚至浏览器都支持MP4封装格式 - MP4文件是一个数据块相互嵌套的树状结构
数据块称为box,不同数据块存储的信息不一样,主要数据块有:- ftyp:存放编码格式、标准等信息
- moov:存放元数据、mdat数据块中的映射关系
- mdat:音频视频数据,依赖moov信息才能推算每帧的播放时间
- 这三个数据块里还会嵌入其他数据块
- mp4info、Mp4Explorer等工具可以查看
- 适合在线播放视频但在线播放不是主营业务
2. FLV (Adobe 公司)
- 与RTMP、HTTP-FLV是类似的
- 一般用作视频在线播放,网页加入flv.js就可以播放
- FLV的每个音视频数据块,都可以有时间戳标识,所以在首帧播放、未加载跳转等场景表现都更为优秀
- 适合以短视频为主,文件不大的网站系统
3. HLS格式
- m3u8索引文件 + 多个ts碎片视频文件
- HLS的未加载跳转,CDN加速,多线程预加载等方面更为优秀
- 适合以长视频为主,文件大的网站系统
- 缺点是需要网站系统自己转封装
五、推拉流协议
1. RTMP
- Real Time Messaging Protocol 实时消息协议
- 底层协议:TCP
rtmp://0.0.0.0:1935/live
- 推拉流地址一样
- 直播源推流,推流到直播CDN,直播系统内直播数据传递
- 一般用于推流不用于拉流的原因:
a. 服务器摒弃了flash播放器
b. 高并发会有些问题
- RTMP需要特定的流媒体服务软件:SRS/RTMP插件的Nginx
- 低延迟,1-3秒左右
- RTMP建立在TCP长链接通道上,在封装音视频数据时会强制切片,限制每个数据包的大小
强制切片也一定程度保证了实时性,有一定的弱网抵抗能力,失败重发的成本不大
但合并数据包时会加大CPU压力,会有一定性能损耗
HTTP-FLV:客户端直播流观看 RTMP的HTTP版本,与RTMP工作原理相似,延迟1-3秒(比RTMP协议延迟略高),HTTP-FLV一般只用于客户端拉流观看
HTTP-FLV直播流一般需要加入插件才能播放,如网页需要引入flv.js才能播放
- RTMP需要特定的软件:SRS/HTTP-FLV插件的Nginx
都是建立在FLV封装格式基础上的
2. HLS
http://0.0.0.0/live.m3u8
- m3u8索引文件 + 多个只有几秒长度的ts碎片视频文件 严格意义讲不是流协议
- 只用于拉流观看,通过HTTP协议下载静态文件,不需要特殊的服务软件,使用Nginx等http服务就可以了
- 加入插件就可播放了,如网页加入HLS的js插件
- 延时 5-30s左右 HLS在点播场景下优势更加明显,直播场景没优势
- 优点:
不需要花费额外性能保存录像
直播转点播,录播都更加简单,只需要修改m3u8索引文件就可以
索引文件支持二级索引,是自动调整清晰度的原理,也支持音频/视频分离
视频文件,索引文件都是直接写入磁盘的 - HLS是苹果公司发布的,MPEG-DASH是国际标准,两者大致相同,只有一些细节不同
3. WebRTC
webrtc://0.0.0.0:8000/live
- 推拉流地址一样
- 不是为了直播场景设计的,是点对点的视频、语音通话协议
- 基于UDP的,延时比RTMP更低,1秒以内
- 如果用在直播场景,需要SRS服务器
4. RTSP
- Real Time Streaming Protocol 实时流协议
- 底层协议:TCP 和 UDP
- 一般不用在直播场景,现代浏览器不能播
- 延迟:2 秒
- RTSP有诸多优点:TCP/UDP切换,支持推流、拉流,支持点播直播
- 一般用在摄像头等硬件设备的实时视频流观看、推送上
- 适用于 IP 摄像机和运行 IP 摄像机的设备,例如无人机
- 适用于监控 和闭路电视 (CCTV) IP 摄像机、物联网设备
- web领域一般不使用RTSP
RTMP和RTSP的区别
RTMP协议一般传输的是flv,f4v格式流,RTSP协议一般传输的是ts,mp4格式的流。HTTP没有特定的流
RTSP传输一般需要2-3个通道,命令和数据通道分离,HTTP和RTMP一般在TCP一个通道上传输命令和数据
RTMP的特点如下:
- Adobe支持得很好:2) 适合长时间播放 3)延迟较低:4) 有累积延迟:
传输层协议
TCP
TCP 英文全称:Transmission Control Protocol,中文意思:传输控制协议。
用于提供可靠的流传输服务,即以字节流的形式传输数据和以字节流的形式接收数据。TCP 使用确认机制来检查数据是否安全可靠地到达,在发送端进行复用,在接收端进行解复用。TCP 使用三个阶段来实现连接定向功能,如连接建立、数据传输和连接终止。
UDP
UDP 英文全称:User Datagram Protocol ,中文意思:用户数据报协议。
UDP是一种无连接协议,即将数据从一端传输到另一端;无需建立连接。UDP 也位于应用层和网络层之间。它还以数据包的形式传递数据或信息;这些数据包称为用户数据报。UDP 使用多路复用来处理来自多个进程的传出用户数据报,并使用解复用来处理进入同一主机上不同进程的传入用户数据报。
OSI网络七层协议
TCP/IP4层模型、5层模型和OSI七层模型的差别
六、ffmpeg处理流程
ffmpeg八大函数库
- avdevice 设备输入/输出
- avformat 封装/解封装
- avcodec 编解码
- avfilter 原始帧Filter处理(复杂处理)
- swscale 原始帧像素格式变换(简单处理),分辨率、采样率切换等
- postproc 视频后处理
- swresample 音频重采样库
- avutil 工具库 包括ffmpeg命令行、ffprobe、ffplay等
结构体简单介绍
一次完整的转码过程一般是按照 解封装 -> 解码 -> 编码 -> 封装 这样的流水线运行
封装/解封装:
- AVStream 媒体流,包含一个媒体的所有元信息
- AVFormatContext 封装/解封装格式上下文
- AVInputFormat 各种封装格式
编解码:
- AVFrame 解码后的数据
- AVPacket 编码后的数据
- AVCodec 编解码器
- AVCodecContext 编解码器上下文