音视频基础 -(编码、封装、推拉流)格式/协议 与 ffmpeg处理流程

本文涉及内容

参考链接

音视频处理课程-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的特点如下:

  1. 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 编解码器上下文
相关推荐
MediaTea3 小时前
Ps:视频图层
音视频
简鹿办公4 小时前
快速上手:利用 FFmpeg 合并音频文件的实用教程
ffmpeg·音频合并命令·ffmpeg合并音频
D^ε^S4 小时前
GB28181系列三:GB28181流媒体服务器ZLMediaKit
服务器·网络·网络协议·音视频
冰冰的coco4 小时前
H264码流介绍 及 FFmpeg解封装得到H264码流方法
ffmpeg
黑金IT4 小时前
编程语言对决:Node.js与Python在视频处理领域
python·node.js·音视频
techSista8 小时前
华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)
华为·智能手机·音视频
Likeadust8 小时前
NVR小程序接入平台/设备EasyNVR深度解析H.265与H.264编码视频接入的区别
音视频·h.265·视频监控·h.264
Likeadust8 小时前
EasyGBS点对点穿透P2P远程访问技术在安防视频监控中的应用
网络协议·音视频·p2p
yerennuo15 小时前
FFmpeg 音视频基础
qt·ffmpeg·音视频