[TOC]
一般包括文本,声音和图像等多种媒体形式。
常见的视频格式无非就是两大类:
在影像格式中还可以根据出处划分为三大种:
在流媒体格式中同样还可以划分为三种:
Microsoft RLE
一种8位的编码方式,只能支持到256色。压缩动画或者是计算机合成的图像等具有大面积色块的素材可以使用它来编码,是一种无损压缩方案。
Microsoft Video 1
用于对模拟视频进行压缩,是一种有损压缩方案,最高仅达到256色,它的品质就可想而知,一般还是不要使用它来编码AVI。
Microsoft H.261/H.263/H.264/H.265
Microsoft MPEG-4 Video codec
Intel Indeo Video R3.2
Intel Indeo Video 4和5
Intel IYUV Codec
DivX?- MPEG-4 Low-Motion/Fast-Motion
DivX 3.11/4.12/5.0
WebM/VP8
Ogg-Theora
指人耳可以听到的声音频率在20HZ~20kHz之间的声波,称为音频。
指存储声音内容的文件。
在某些方面能指作为滤波的振动。
数码信号和模拟信号
音频数字化的标准是每个样本16位(16bit,即96dB)的信噪比,采用线性脉冲编码调制PCM,每一量化步长都具有相等的长度。在音频文件的制作中,正是采用这一标准。
wav使用的是数码信号,它是用一堆数字来描述原来的模拟信号
“*.mp1"/“*.mp2”/“*.mp3”
这3种声音文件。需要提醒大家注意的地方是:MPEG音频文件的压缩是一种有损压缩,MPEG3音频编码具有10:1~12:1的高压缩率,同时基本保持低音频部分不失真,但是牺牲了声音文件中12KHz到16KHz高音频这部分的质量来换取文件的尺寸,相同长度的音乐文件,用*.mp3格式来储存,一般只有*.wav文件的1/10,而音质要次于CD格式或WAV格式的声音文件。由于其文件尺寸小,音质好;所以在它问世之初还没有什么别的音频格式可以与之匹敌,因而为*.mp3格式的发展提供了良好的条件。直到现在,这种格式还是风靡一时,作为主流音频格式的地位难以被撼动。但是树大招风,MP3音乐的版权问题也一直是找不到办法解决,因为MP3没有版权保护技术,说白了也就是谁都可以用。Speex, AAC, Ogg/Vorbis
https://www.toutiao.com/i6841924924513190407/
FFmpeg
FFmpeg是目前最全面的开源音视频编解码库,包括常用的音视频编码协议 H265、H264、MPEG4、H263、G.721、G.726、G.729等,并且它提供了一整套的音视频处理解决方案,包括音视频采集与编码、音视频解码、视频格式转换、视频抓图、给视频加水印等。
https://ffmpeg.org/
WebRTC
WebRTC是一个由Google发起的开源音视频实时通讯解决方案,其中包括音视频的采集、编解码、网络传输、解码显示等,我们可以通过该技术快速地构建出一个音视频通讯应用。
虽然其名为WebRTC,但是实际上它不光支持Web之间的音视频通讯,还支持Windows、Android以及iOS等移动平台。WebRTC底层是用C/C++开发的,具有良好的跨平台性能。WebRTC因为其较好的音视频效果及良好的网络适应性,目前已被广泛的应用到视频会议系统中,比如视频会议厂商华为、ZOOM、小鱼易连、科达均支持了WebRTC方式的音视频转发会议。
https://webrtc.org/
x264
x264是一个开源的H.264/MPEG-4 AVC视频编码函数库,是最好的有损视频编码器之一。H264是目前应用最广的码流标准,x264则能够产生符合H264标准的码流的编码器,它可以将视频流编码为H264、MPEG4 AVC格式。它提供了命令行接口与API,前者被用于一些图形用户接口例如Straxrip、MeGUI,后者则被FFmpeg、Handbrake等调用。当然,既然有x264,就有对应HEVC/H.265的x265。
https://www.videolan.org/developers/x264.html
Live555
Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了标准流媒体传输,是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。
Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括H265、H264、MPEG4、H.263+ 、DV、JPEG视频和多种音频编码。同时由于良好的设计,Live555非常容易扩展对其他格式的支持。
http://www.live555.com/
SDL
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器、视频会议系统等产品开发中。
https://www.libsdl.org
Opus
Opus是用C语言开发的一个高灵活度的音频编码器,针对ARM、x86有特殊优化,fix-point实现。Opus在各方面都有着明显优势。它同时支持语音与音乐的编码,比特率为6k-510k。它融合了SILK编码方法和CELT编码方法。SILK原本被用于Skype中,基于语音信号的线性预测分析(LPC),对音乐支持并不好。而CELT尽管适用于全带宽音频,但对低比特率语音的编码效率不高,所以两者在Opus中形成了互补。
https://opus-codec.org/
ffplay
ffplay是ffmpeg的一个子工具,所以其开源代码也是内置在FFmpeg项目中的。ffplay内部使用了FFmpeg和 SDL库,是一个简单的可移植的媒体播放器。它具有强大的音视频解码播放能力,目前它广泛被各种流行播放器(QQ影音、暴风影音……)集成应用。作为一款开源软件,ffplay囊括Linux、Windows、Ios、Android等众多主流系统平台,十分适合进行二次开发。
http://ffmpeg.org/ffplay.html
VLC
VLC是一款自由、开源的跨平台多媒体播放器及框架,它可以播放来自网络、摄像头、磁盘、光驱的文件,支持包括MPEG4、H264、H265、DivX、WMV、Vorbis、AC3等多种音视频协议。VLC最为突出的就是流媒体文件的功能,VLC支持各种流媒体协议,能直接播放远端的流媒体视频,只要输入一个视频文件的网址即可,无需下载到本地。此外,VLC还可以直接播放没有下载完成的文件。
VideoLanServer(VLS)的功能已经合并到VLC中,所以VLC不仅仅是一个音视频播放器,它也可以作为小型的视频服务器或流媒体服务器使用,可以一边播放一边转码,把视频流发送到网络上。
https://www.videolan.org/
ijkplayer
在介绍ijkplayer播放器之前,要先提到FFmpeg中的ffplay。ffplay是一个使用了FFmpeg和SDL库的可移植的媒体播放器。ijkplay是国内知名的视频弹幕网站Bilibili开源的基于ffplay.c实现的轻量级iOS/Android视频播放器,API易于集成,且编译配置可裁剪,利于控制安装包大小。
在编解码方面,ijkplayer支持视频软解和硬解,可以在播放前配置,但在播放过程中则不能切换。iOS和Android上视频硬解可分别使用大家熟悉的VideoToolbox和MediaCodec。但ijkplayer对音频仅支持软解。
https://github.com/Bilibili/ijkplayer
很多多媒体数据流需要同时包含音频数据和视频数据,这时通常会加入一些用于音频和视频数据同步的元数据,例如字幕和弹幕。这三种数据流可能会被不同的程序,进程或者硬件处理,但是当它们传输或者存储的时候,这三种数据通常是被封装在一起的。通常这种封装是通过视频文件格 式来实现的,例如常见的*.mpg, *.avi, *.mov, *.mp4, *.rm, *.ogg or *.tta. 这些格式中有些只能使用某些编解码器,而更多可以以容器的方式使用各种编解码器。
FourCC全称Four-Character Codes,是由4个字符(4 bytes)组成,是一种独立标示视频数据流格式的四字节,在wav、avi档案之中会有一段FourCC来描述这个AVI档案,是利用何种codec来 编码的。因此wav、avi大量存在等于“IDP3”的FourCC。
视频是现在电脑中多媒体系统中的重要一环。为了适应储存视频的需要,人们设定了不同的视频文件格式来把视频和音频放在一个文件中,以方便同时回放。视频档实际上都是一个容器里面包裹着不同的轨道,使用的容器的格式关系到视频档的可扩展性。
流媒体(streaming media)是指将一连串数据压缩后,经过网络分段发送,即时传输以供观看音视频的一种技术。
通过使用 streaming media 技术,用户无需将文件下载到本地即可播放。由于媒体是以连续的数据流发送的,因此在媒体到达时即可播放。可以像下载的文件一样进行暂停、快进或后退操作。
RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。
(1)是流媒体协议。
(2)RTSP协议是共有协议,并有专门机构做维护。.
(3)RTSP协议一般传输的是 ts、mp4 格式的流。
(4)RTSP传输一般需要 2-3 个通道,命令和数据通道分离。
RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。RTMP与HTTP一样,都属于TCP/IP四层模型的应用层。
(1)是流媒体协议。
(2)RTMP协议是 Adobe 的私有协议,未完全公开。
(3)RTMP协议一般传输的是 flv,f4v 格式流。
(4)RTMP一般在 TCP 1个通道上传输命令和数据。
rtmp://58.200.131.2:1935/livetv/hunantv # 湖南卫视
rtmp://media3.scctv.net/live/scctv_800 # CCTV
M3U 文件是一种纯文本文件,可以指定一个或多个多媒体文件的位置。它的设计初衷是为了播放音频文件,但后来越来越多的用于播放视频文件列表。
多个m3u8的索引文件
transport stream 的缩写,全称为 “MPEG2-TS”:
MPEG2-TS 传输流(MPEG-2 Transport Stream;又称 MPEG-TS、MTS、TS)是一种标准数字封装格式,用来传输和存储视频、音频与频道、节目信息,应用于数字电视广播系统,如 DVB、ATSC、ISDB:118、IPTV 等。
ts文件索引playlist.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:4.042667,
/m3u8/seg1.ts
#EXTINF:4.000000,
/m3u8/seg2.ts
#EXTINF:4.000000,
/m3u8/seg3.ts
#EXTINF:4.000000,
/m3u8/seg4.ts
#EXTINF:4.000000,
/m3u8/seg5.ts
#EXTINF:4.000000,
/m3u8/seg6.ts
#EXT-X-ENDLIST
ts可以是相对路径, 也可以是绝对路径(http/https)
用下面命令将其合并成一个大的 ts 文件,然后转成一个 mp4 文件:
$ ffmpeg -f concat -safe 0 -i playlist.m3u8 -c copy output.ts
$ ffmpeg -i output.ts -acodec copy -vcodec copy output.mp4
下面的命令直接将其保存为 mp4 文件:
$ ffmpeg -i http://cdn.zlib.cn/m3u8/test.m3u8 -c copy output.mp4
为了保护数字版权,大部分的视频网站会对 ts 片段进行加密,例如下面的数据源:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-ALLOWCACHE:1
#EXT-X-KEY:METHOD=AES-128,URI="seg1.key"
#EXTINF:4.458667,
seg1.ts.enc
#EXT-X-KEY:METHOD=AES-128,URI="seg2.key"
#EXTINF:4.010000,
seg2.ts.enc
#EXT-X-KEY:METHOD=AES-128,URI="seg3.key"
#EXTINF:4.468667,
seg3.ts.enc
#EXT-X-KEY:METHOD=AES-128,URI="seg4.key"
#EXTINF:3.893000,
seg4.ts.enc
#EXT-X-KEY:METHOD=AES-128,URI="seg5.key"
#EXTINF:4.007333,
seg5.ts.enc
#EXT-X-TARGETDURATION:5
#EXT-X-ENDLIST
发现多了一些字段,例如:
EXT-X-KEY 就是表示经过加密的,基本格式形如:
#EXT-X-KEY:METHOD=AES-128,URI=”http://example.com/key",IV=0x0123456789abcdef0123456789abcdef
AES-128 且有 iv 填充的是 aes-cbc 算法,解码需要 iv (偏移量)和 key (秘钥),EXT-X-KEY 那一行记录了密钥的获取路径和偏移量的值,如果拿到正确的 key 和 iv 的话,可以用下面的命令进行解密:
$ openssl aes-128-cbc -d -in seg0.ts -out seg0.decode.ts -nosalt -iv xxx -K xxx
也可以用 ffmpeg 来进行快速处理:
$ ffmpeg -allowed_extensions ALL -i http://cdn.zlib.cn/m3u8/test.enc.m3u8 -c copy video5.mp4
但是为了防止用户下载,一般会在 js 中对 key 进行动态处理,以气球云为例,它的 m3u8 播放源文件格式如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:20
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://play.qiqiuyun.net/sdk_api/video/hls_clef/shd?resNo=xxx&token=xxx&ssl=1",IV=xxx
#EXTINF:10.200,
https://xxx-pub.pubssl.qiqiuyun.net/xxx/xxx?schoolId=xxx&fileGlobalId=xxx
#EXT-X-KEY:METHOD=
有的是直接
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:4.042667,
/m3u8/seg1.ts?auth_key=xxxxxx
#EXT-X-ENDLIST
第一次加载m3u8 的内容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:31
#EXT-X-TARGETDURATION:5
#EXTINF:5.079,
31.ts
#EXTINF:5.083,
32.ts
#EXTINF:5.201,
33.ts
第二次加载m3u8 的内容是:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:32
#EXT-X-TARGETDURATION:5
#EXTINF:5.083,
32.ts
#EXTINF:5.201,
33.ts
#EXTINF:5.100,
34.ts
我们能看到,第一次加载m3u8时,ts切片,最后一个切片,名字是 33.ts;第二次加载m3u8时,ts切片,最后一个切片,名字是 34.ts ;
并且,m3u8文件中没有 #EXT-X-ENDLIST; 就是通过这种循环加载的方式,这个直播,能一直循环加载下去。
EXT-X-PLAYLIST-TYPE 标签(可选)值为 VOD,表示播放列表不可变。
刚开始时,对应的 M3U8 文件内容如下所示:
#EXTM3U
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
EXT-X-PLAYLIST-TYPE 标签值为 EVENT,表示播放列表内容可变,不过只能在文件末尾改变。
结束时,M3U8 文件内容如下所示:
#EXTM3U
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
...
#EXTINF:10,
fileSequence120.ts
#EXTINF:10,
fileSequence121.ts
#EXT-X-ENDLIST
EVENT 播放列表可以用在直播中,通常用于晚会和体育赛事场景,用户一方面可以观看直播,一方面还能做 seek 操作回退到之前的时间点去回放。
EXT-X-BYTERANGE 我只想用一个ts来构建一个类似M3U8的分片索引, 这时候EXT-X-BYTERANGE就派上用场了.当然只有VERSION版本不低于4才可以应用这个属性
EXT-X-DISCONTINUITY 标签
在一些场景下,我们需要在点播或直播中插入其他内容,比如广告
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
ad0.ts
#EXTINF:8.0,
ad1.ts
#EXT-X-DISCONTINUITY
#EXTINF:10.0,
movieA.ts
#EXTINF:10.0,
movieB.ts
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,AVERAGE-BANDWIDTH=6000000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
通过 3 个不同码率的视频流和 1 个音频流来描述一个内容。
<object type="application/x-shockwave-flash" src="xxx.flv"></object>
(1)不是是流媒体协议。
(2)HTTP协议是共有协议,并有专门机构做维护。
(3)HTTP协议没有特定的传输流。
(4)HTTP传输一般需要 2-3 个通道,命令和数据通道分离。
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
CCTV5高清:http://ivi.bupt.edu.cn/hls/cctv5hd.m3u8
CCTV5+高清:http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8
CCTV6高清:http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8
苹果提供的测试源(点播):
http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8
实时通信
非官网:https://daumpotplayer.com/download/
https://t1.daumcdn.net/potplayer/PotPlayer/Version/Latest/PotPlayerSetup.exe
https://t1.daumcdn.net/potplayer/PotPlayer/Version/Latest/PotPlayerSetup64.exe
电影的各种版本,格式,视频音频编码,字幕,你都了解吗?
各种音频视频编码方法
各种音视频编解码学习详解
五种常见流媒体协议
Audiokit: audiokit/AudioKit
ffmpeg: FFmpeg/FFmpeg