1. 多媒体的直播场景介绍
1.1. 直播场景的技术基础架构图
1.2. 视频直播类功能的技术上整体流程包括以下内容:
- 音视频采集
- 音视频处理
- 音视频编码和封装 ()
- 推流
- 流媒体服务器处理
- 拉流
- 音视频解码
- 音视频播放
1.3. 视频直播的整个的感官流程:
- 主播共享端发起一个信令,比如:创建房间(或聊天、发送礼物等),到达信令服务器;信令服务器处理并且创建一个房间,同时返回给主播共享端一个流媒体云的地址。
- 接下来,主播共享端采集数据(音视频的采集、处理以及编码封装流程)形成RTMP流推送到CDN网络(推流)。
- 观众要进行观看时,客户端会发送信令到信令服务器,信令服务器将该观众加入到主播的房间中,同时也会返回一个流媒体云的地址(该地址就是之前主播端的流媒体云地址)。
- 客户端拿到此流媒体云地址后,就会到流媒体云服务器拉取到该媒体流(拉流和解码),从而看到要观看的直播节目(播放器播放)。
2. 多媒体常用名词
2.1. 码率:
码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb/s或者Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。
2.2. 帧率:
帧——是影像动画中最小的单位,无数的帧构成了秒;帧速率也称为FPS(Frames PerSecond)的缩写——帧/秒。是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。每秒钟帧数(FPS)越多,所显示的动作就会越流畅。捕捉动态视频内容时,此数字愈高愈好。
2.3. 分辨率:
分辨率,又称解析度、解像度,可以从显示分辨率与图像分辨率两个方向来分类。 显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少;图像分辨率则是单位英寸中所包含的像素点数
2.4. 编码:
比如视视频编码,频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频。由于连续的帧之间相似性极高,为便于储存传输,我们需要对原始的视频进行编码压缩,以去除空间、时间维度的冗余,即通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式 。目前主流的音视频编码格式主要是MPEG4、H.254 详细可参考主流的编码格式
2.5. 封装:
就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,或者一个锅,用来盛放饭菜的容器。封装格式比如:FLV、MP4、M3U8、RMVP、MP3等
比如:QuickTime(.MOV)支持几乎所有的编解码方式,MPEG(.MP4)也支持大部分的编解码方式。H.264/MOV的视频文件, 可以这样描述:封装方式是QuickTime File Format,文件格式是.MOV,编码方式是H.264。
2.6. 编码和封装的关系:(通俗易懂)
一张图片可以用很多种算法来显示在屏幕中,这里面包含着很复杂的学术内容。所以图片的编码方式上就有了JPEG,BMP,PNG等… 视频正是动态图像,所以在这里就有多出了一个概念,用怎样的方式表达1s内的24张图片,这就是简单意义上的视频编码,有了问题,就有了很多解决方案,所以就诞生了MPEG,H.264,等多种编码格式。再过几年音频也来了,字幕也来了,配音也来了,所以就需要一个容器来把他们全部放进去保存,所以就诞生了封装格式。比如FLV,MP4,MKV,M3U8等… 有了怎么放到容器里的问题,就又有了很多解决方案,所以出现这么些格式,其中MKV为最流行,因为他支持多轨道音频,字幕,视频的封装,所以广泛用于电影文件格式中。
比如,单播一路视频或者一路音频是不需封装的,播放端与服务器以相同的平均速度一收一发即可。如果视频加上音频情况就变得很复杂了,这个时候要同步两者。所谓容器就是给他们打上时间戳,让两者能同步起来,声音对上嘴型。所以,拿笔在纸上写一百遍:容器为了解决同步,即封装。
2.7. 流媒体:
流媒体(Streaming Media)技术是指将一连串的媒体数据压缩后,以流的方式在网络中分段传送,实现在网络上实时传输影音以供观赏的一种技术。指的是一种新的媒体传送方式,流式传输方式,分为顺序流式传输(HTTP流式传输)、实时流式传输(该方式需要 RTSP( realtime streaming protocol)或MMS(microsoft media server)、RTMP、HLS网络协议的支持),流式传输使得用户不必等到整个文件全部下载完毕,而只需经过几秒或十数秒的启动延时即可进行观看。当声音等时基媒体在客户机上播放时,文件的剩余部分将在后台从服务器内继续下载。流式不仅使启动延时成十倍、百倍地缩短,而且不需要太大的缓存容量。其中主流的DASH(Dynamic Adaptive Streaming over HTTP的缩写,是国际标准组 MPEG 2014年推出的技术标准, 主要目标是形成IP网络承载单一格式的流媒体并提供高效与高质量服务的统一方案)是基于HTTP的动态自适应的比特率流技术,使用的传输协议是TCP. 和HLS, HDS技术类似, 都是把视频分割成一小段一小段, 通过HTTP协议进行传输,客户端得到之后进行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4等多种格式, 可以将视频按照多种编码切割, 下载下来的媒体格式既可以是ts文件也可以是mp4文件, 所以当客户端加载视频时, 按照当前的网速和支持的编码加载相应的视频片段进行播放.
2.8. 混流:
多个视频画面混合成一个视频画面(或是多路音频合成一路声音),比如视频混流的过程,是指定一块画面区域,在此区域内,按画面的位置布局,将区域中的每个视频画面的像素混合计算成一个像素。主要涉及到的是图层与颜色计算;音频混流的基本原理是将多个音频源的波形按一定的算法进行叠加计算,混合成一路音频波形。需要注意的是音频叠加的算法是非线性的,不能简单地依靠波形数据的值进行加减。
2.9. 推流:
把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观众观看直播时就会发生卡顿等现象,观看体验很是糟糕。
比如多主播直播时,观众客户吧以及混了几个主播的音频流 拉下来,这叫拉流, 前提是得有一个地方先混流(把几个主播的音视频流混合)成一个“单流”,然后在推流到服务器,这时广州才能从服务器上拉流下来。
3. 流媒体未来主流技术
流媒体的未来趋势分析
3.1. 流媒体格式和容器的未来趋势
RTMP : (Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议 它的实时性非常好,延迟很小,但无法支持移动端WEB 播放是它的硬伤。
FLV: (Flash Video) 是 Adobe 公司推出的另一种视频格式,是一种在网络上传输的流媒体数据存储容器格式。HTTP-FLV 即将流媒体数据封装成 FLV 格式 。国内从2015年开始,大量的直播APP的协议还是FLV。从标准化的情况来看,我们认为FLV还是一个私有协议。 它也有缺点, 视频的内容会缓存到用户本地, 保密性不好
HLS: HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。是苹果公司QuickTime X和iPhone软件系统的一部分, HLS支持MPEG-2 TS标准(WWDC16 苹果宣布支持 Fragmented MP4), 移动端支持良好, 现在已经成为移动端H5直播的主要技术, 它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率
DASH: Dynamic Adaptive Streaming over HTTP的缩写,是国际标准组 MPEG 2014年推出的技术标准,DASH是基于HTTP的动态自适应的比特率流技术,使用的传输协议是TCP(有些老的客户端直播会采用UDP协议直播, 例如YY, 齐齐视频等). 和HLS, HDS技术类似, 都是把视频分割成一小段一小段, 通过HTTP协议进行传输,客户端得到之后进行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4等多种格式, 可以将视频按照多种编码切割, 下载下来的媒体格式既可以是ts文件也可以是mp4文件, 所以当客户端加载视频时, 按照当前的网速和支持的编码加载相应的视频片段进行播放.
DASH-CMAF/HLS-CMAF : CMAF是Common Media Application Format的缩写,由微软、苹果联合MLBAM、思科、Akamai和Comcast在2016年2月向动态图像专家组(MPEG)提出,并在今年7月被批准成为国际标准。是一种可扩展的编码标准,通过指定一致的媒体包装和加密来实现内容和设备之间的互操作性。CMAF是一个标准化的容器,可以同时容纳视频和音频文件,且并不会对现有编码格式进行任何改变。 CMAF诞生的原因:由于不同的封装格式,即使最终播放的实际媒体格式相同,需要创建不同的封装格式版本。这样服务提供商必须在视频传输流之前这样做,它需要大量的存储空间,因为需要创建和存储所有不同的版本,这需要额外的处理能力来在传输时重新打包和封装介质。CMAF可以有效地被大家接受是因为CMAF有效地解决了HLS和DASH的分割,原来的HLS是用传统广电的TS容器,DASH一直用的是mp4的格式,现在苹果终于接受了Fragment MP4,可以通过CMAF统一的格式,让你的生产、分发和在用户的缓存层面所有的都变成一份
3.2. 主流的编码格式
主流的视频编码格式
h.264: 最常见的视频编码格式,是由国际电信联盟制定的,侧重网络传输。H.264有着更高的数据压缩比,在同等的图像质量,H.264比其他编码格式要高1.5~3倍,所以在网络传输中需要更少的宽带,主要应用于实时传播,比如视频会议。缺点是对播放的硬件系统要求相对比较高
h.265:在H.264的基础上,对一些技术进行了改进,只需要原来带宽的一半就可以播放同样质量的视频.
mpeg4: MPEG4是一套用于音频、视频信息的压缩编码格式,常用于网络流媒体传输方面,把原有的高清视频文件按照比例缩小到一定尺寸,以减少文件的大小。应用MPEG4的影音最大的特点就是压缩率高并且图像清晰。特别适合长时间实时录制,同时具备在低宽带上优良的网络传输能力。
4. FFmpeg介绍
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。提供了多种媒体格式的封装和解封装,以及多种音视频的编码和解码,多种色彩格式转换,多种采样率转换、多种码率转换等
FFmpeg框架的基本组成包含AVFormat(封装模块), AVCodec(编解码模块), AVFilter(滤镜模块)等模块库组成.
4.1. FFmpeg安装步骤
- 下载
ffmpeg
官网下载: http://ffmpeg.org/download.html
安装yasm
官网下载:http://yasm.tortall.net/Download.html
- 安装yasm
上传至Linux准备安装,解压、安装
| tar -xvzf yasm-1.3.0.tar.gz cd yasm-1.3.0/./configuremakemake install |
|:----|
- 安装ffmpeg
| 上传至Linux准备安装,解压、安装 tar -xvzf ffmpeg-4.2.2.tar.gz cd ffmpeg-4.2.2/ ./configure --enable-shared --prefix=/opt/ffmpeg make (编译过程会有点长) make install (会把ffmpeg相关执行程序、头文件、lib库安装在/opt/ffmpeg/下) 创建一个文件并写入lib路径 即可执行命令:vim /etc/ld.so.conf.d/ffmpeg.conf 然后添加一行内容:/opt/ffmpeg/lib 之后保存并退出(esc : wq) 然后执行 ldconfig 使配置生效, 现在再次执行./ffmpeg -version 显示就正常了 |
|:----|
- 配置软链接 (ln -s 源文件 目标文件)
ln -s /opt/ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg
4.2. FFmpeg工具基础
FFmpeg安装成功之后,本地会有这两个工具: ffmpeg多媒体的编解码工具, ffprobe多媒体内容分析工具。
4.3. ffprobe多媒体内容分析工具的使用示例
查看该文件的封装详细信息
./ffprobe -show_format xitiejie.mp4
查看该文件的包的详细信息
./ffprobe -show_packets xitiejie.mp4
4.4. ffmpeg多媒体编解码工具的使用示例
示例中的demo视频在附件中
4.4.1. ffmpeg转封装处理
将rtmp直播流 CCTV1 录制下来封装为flv格式
./ffmpeg -i rtmp://58.200.131.2:1935/livetv/cctv1 -c copy -f flv rtmpcctv.flv
flv转封装为mp4
./ffmpeg -i rtmpcctv.flv -vcodec copy -acodec copy rtmpcctv.mp4
4.4.2. ffmpeg转码处理
将该文件转码为mpeg4 格式 并设置码率为200kbs 帧率为15, 并且去掉音频,转封装为mp4文件
./ffmpeg -i xitiejie.mp4 -vcodec mpeg4 -b:v 200k -r 15 -an output.mp4
4.4.3. ffmpeg流媒体处理
将http流 快进30s 录制下来 封装为MP4格式
./ffmpeg -ss 30 -seekable 1 -i http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4 -c copy -y httpseek.mp4
将多段视频无缝拼接成一段视频
crf参数解释,filter_complex 参数解释,concat参数解释
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -c:v libx264 -crf 18 -filter_complex "0:vscale=w=1664:h=786,setsar=1/1v0; 1:vscale=w=1664:h=786,setsar=1/1v1; 2:vscale=w=1664:h=786,setsar=1/1v2; 3:vscale=w=1664:h=786,setsar=1/1v3; v0v1v2v3concat=n=4:v=1:a=1 vv" -map "vv" -map "aa" -vsync vfr target.mp4
4.4.4. ffmpeg滤镜处理
给该视频增加文字滤镜
./ffmpeg -i rtmpcctv.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello mengmin':x=20:y=20" shuiyin.mp4