流媒体服务
一、音视频的组成
一个完整的视频文件,包括音频、视频和基础元信息,我们常见的视频文件如mp4、mov、flv、avi、rmvb等视频文件,就是一个容器的封装,里面包含了音频和视频两部分,并且都是通过一些特定的编码算法,进行编码压缩过后的。
因此,视频转换需要设置的本质就是
- 设置需要的视频编码
- 设置需要的音频编码
- 选择需要的容器封装
一个完整的视频转换设置都至少包括了上面3个步骤。
1、视频编码格式
视频编码标准有两大系统: MPEG 和ITU-T,国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+、H.264等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。
常见编码格式有:
- Xvid(MPEG4)
- H264 (目前最常用编码格式)
- H263
- MPEG1,MPEG2
- AC-1
- RM,RMVB
- H.265(目前用的不够多)
2、音频编码格式
音频编码格式有如下
- AAC
- AMR
- PCM
- ogg(ogg vorbis音频)
- AC3(DVD 专用音频编码)
- DTS(DVD 专用音频编码)
- APE(monkey’s 音频)
- AU(sun 格式)
- WMA
音频编码方案之间音质比较(AAC,MP3,WMA等)结果: AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3。
目前最常见的音频格式有 Mp3、AC-3、ACC,MP3最广泛的支持最多,AC-3是杜比公司的技术,ACC是MPEG-4中的音频标准,ACC是目前比较先进和具有优势的技术。
3、存储封装格式
目前市面常见的存储封装格式有如下:
- AVI (.avi)
- ASF(.asf)
- WMV (.wmv)
- QuickTime ( .mov)
- MPEG (.mpg / .mpeg)
- MP4 (.mp4)
- m2ts (.m2ts / .mts )
- Matroska (.mkv / .mks / .mka )
- RM ( .rm / .rmvb)
- TS/PS
AVI : 可用MPEG-2, DIVX, XVID, WMV3, WMV4, AC-1, H.264
WMV : 可用WMV3, WMV4, AC-1
RM/RMVB : 可用RV40, RV50, RV60, RM8, RM9, RM10
MOV : 可用MPEG-2, MPEG4-ASP(XVID), H.264
MKV : 所有
视频的基本播放流程如下:
二、视频流
经过压缩算法压缩的流数据,称为『编码流』,又因为目前压缩/编码算法以H264为主,因此也常常称为『H264码流』
未经压缩的流数据,是解码后的流数据,称为『原始流』,可以想象视频是由一幅一幅在时间上连续的“图像”组成的,而因为视频内部的“图像”是『YUV』(后文将介绍),因此也常常称为『YUV流』。
编码/压缩在流媒体领域是一项非常重要的技术:从『H264码流』到『YUV流』的过程称为解码,反之称为编码。
『流』的基本元素是『帧』,对于视频编码/压缩而言,它的核心是采用尽量小的空间存储一组时间上连续的帧数据;而对于视频解码而言,就是把被编码/压缩后的一组帧数据尽量恢复成原来的样子。能够被100%恢复的编码/压缩算法称为无损压缩,反之称为有损压缩(虽然无损压缩是最理想的,但是在很多实际场景中为了追求高压缩率,比如为了减小网络带宽压力,常常不得不选择有损压缩)
『帧』,可以联想成我们平时看到的一幅幅“图像”,只不过我们平时接触的图片是『RGB』格式的,而视频帧通常是『YUV』格式的。
完整的视频流媒体流程如下:
- Avc/Hevc帧:H.264(也称为 AVC 或高级视频编码)是视频压缩的行业标准,允许录制、压缩和分发数字视频内容。H.265(也称为 HEVC 或高效视频编码)允许进一步减小文件大小,从而减少实时视频流所需的带宽,是高效率视频编码。Avc/Hevc是组成Nalu的基本组织格式。
- RTSP(Real Time Streaming Protocol):实时流传输协议,是TCP/IP协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。
- RTP(Real-time Transport Protocol):RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它是创建在UDP协议上的。
拉流->解码->模型检测->渲染->编码->推流
三、拉流RTSP协议
从零开始写一个RTSP服务器(一)RTSP协议讲解-CSDN博客
rtp数据包中包含的是h264或者h265编码后的数据,而编码数据的呈现为nalu
rtp头部+nalu头部+payload
四、编解码
1、软解码
使用ffmepg工具的解码流程如下:
**注意:**解码队列缓存导致不同步问题,使用avcodec_flush_buffers()清空缓存
nalu->yuv