直播知识

一个完整的视频直播过程,包括采集、处理、编码、封装、推流、传输、转码、分发、解码、播放等。

一、采集

音频采集

音频的采集过程主要通过设备将环境中的模拟信号采集成 PCM 编码的原始数据,然后编码压缩成 MP3 等格式的数据分发出去。常见的音频压缩格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。

图像采集

图像的采集过程主要由摄像头等设备拍摄成 YUV 编码的原始数据,然后经过编码压缩成 H.264 等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。

二、处理

视频或者音频完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理。

视频:美颜、水印、路径、自定义

音频:混音、降噪、特效、自定义

三、编码

对流媒体传输来说,编码非常重要,它的编码性能、编码速度和编码压缩比会直接影响整个流媒体传输的用户体验和传输成本。

常见的视频编码器:

  • H.264/AVC

  • HEVC/H.265

  • VP8

  • VP9

  • FFmpeg

音频编码器:

  • Mp3

  • AAC

四、封装

把编码器生成的多媒体内容(视频,音频,字幕,章节信息等)混合封装在一起

几种常见的封装格式:

  • AVI 格式(后缀为 .avi)

  • DV-AVI 格式(后缀为 .avi)

  • QuickTime File Format 格式(后缀为 .mov)

  • MPEG 格式(文件后缀可以是 .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4等)

  • WMV 格式(后缀为.wmv .asf)

  • Real Video 格式(后缀为 .rm .rmvb)

  • Flash Video 格式(后缀为 .flv)

  • Matroska 格式(后缀为 .mkv)

  • MPEG2-TS 格式 (后缀为 .ts)

目前,我们在流媒体传输,尤其是直播中主要采用的就是 FLV 和 MPEG2-TS 格式,分别用于 RTMP/HTTP-FLV 和 HLS 协议。

五、推流

推流是指使用推流工具等内容抓取软件把直播内容传输到服务器的过程。

推送协议主要有三种:

RTSP(Real Time Streaming Protocol):实时流传送协议,是用来控制声音或影像的多媒体串流协议, 由Real Networks和Netscape共同提出的;

RTMP(Real Time Messaging Protocol):实时消息传送协议,是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议;

HLS(HTTP Live Streaming):是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议;

RTMP是目前主流的流媒体传输协议,广泛用于直播领域,市面上绝大多数的直播产品都采用了这个协议。

RTMP协议基于 TCP,是一种设计用来进行实时数据通信的网络协议,主要用来在 flash/AIR 平台和支持 RTMP 协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括 Adobe Media Server/Ultrant Media Server/red5 等。

它有三种变种:

RTMP工作在TCP之上的明文协议,使用端口1935;

RTMPT封装在HTTP请求之中,可穿越防火墙;

RTMPS类似RTMPT,但使用的是HTTPS连接;

RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据。一个单一的连接可以通过不同的通道传输多路网络流。这些通道中的包都是按照固定大小的包传输的。

六、传输

推送出去的流媒体需要传输到观众,整个链路就是传输网络。

七、转码

视频直播播流端的码率是根据推流端决定的,即播流端的码率是与推流端的码率一致的。但是遇到以下场景会造成直播效果较差:

推流端码率与播流端带宽不相匹配。当推流端码率较高而客户端带宽资源有限就会导致播放出现卡顿,而当推流端码率较低但是客户端对于直播效率要求较高时会导致播放效果较差。

播放器插件需要实现多码率切换。前端播放器插件常可以设置码率切换,这就需要同一路推流可以同时提供多种码率的播流地址。

因此,视频直播提供了实时转码功能对同一路推流地址同时提供多路不同码率播流地址提供服务。

八、分发

流媒体服务器的作用是负责直播流的发布和转播分发功能。

九、解码

编码器(Encoder):压缩信号的设备或程序

解码器(Decoder):解压缩信号的设备或程序

编解码器(Codec):编解码器对

十、播放器流播放

主要是实现直播节目在终端上的展现。因为这里使用的传输协议是RTMP, 所以只要支持 RTMP 流协议的播放器都可以使用,譬如:

电脑端:VLC等

FFMPEG的基本使用方法

安装

1, 命令行安装

1
brew install ffmpeg --with-ffplay

--with-ffplay为附加选项, 标示安装ffmpeg的同时安装ffplay

其他附加选项还有如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
–with-fdk-aac  (Enable the Fraunhofer FDK AAC library)
–with-ffplay  (Enable FFplay media player)
–with-freetype  (Build with freetype support)
–with-frei0r  (Build with frei0r support)
–with-libass  (Enable ASS/SSA subtitle format)
–with-libcaca  (Build with libcaca support)
–with-libvo-aacenc  (Enable VisualOn AAC encoder)
–with-libvorbis  (Build with libvorbis support)
–with-libvpx  (Build with libvpx support)
–with-opencore-amr  (Build with opencore-amr support)
–with-openjpeg  (Enable JPEG 2000 image format)
–with-openssl  (Enable SSL support)
–with-opus  (Build with opus support)
–with-rtmpdump  (Enable RTMP protocol)
–with-schroedinger  (Enable Dirac video format)
–with-speex  (Build with speex support)
–with-theora  (Build with theora support)
–with-tools  (Enable additional FFmpeg tools)
–without-faac  (Build without faac support)
–without-lame  (Disable MP3 encoder)
–without-x264  (Disable H.264 encoder)
–without-xvid  (Disable Xvid MPEG-4 video encoder)
–devel  (install development version 2.1.1)
–HEAD  (install HEAD version)

Mac 搭建rtmp流媒体服务器

使用官方安装包安装
安装常见问题:

安装后启动不了, 启动报错

1
2
3
4
5
6
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
nginx: [emerg] still could not bind()

重启或者关闭也报错

1
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

解决方法:

1
sudo nginx -c /usr/local/etc/nginx/nginx.conf
使用HomeBrew安装Nginx

需要添加新的formula仓库,官方没有nginx-full只有nginx…, 具体命令如下

1
2
$ brew tap denji/nginx
$ brew install nginx-full --with-rtmp-module
安装rtmp模块

配置nginx.conf 配置mac流媒体服务器

配置之后报错:

1
unknown directive "rtmp" in /usr/local/etc/nginx/nginx.conf:119	 说明rtmp模块没有安装好

推流后报错如下: [flv @ 0x7fa20f821200] Failed to update header with correct duration. [flv @ 0x7fa20f821200] Failed to update header with correct filesize.

推流完成后会报这个错, 不用惊慌, 换一个长一点的文件试试

Mac下卸载Nginx服务器

卸载命令行:
1
2
3
方式一: brew uninstall nginx

方式二: brew uninstall nginx-full

使用方式一还是方式二取决于你安装的方式, 如果你使用 brew install nginx安装, 那么使用方式一卸载, 否则使用第二种方式

Mac 下使用brew卸载Nginx软件时配置文件和www目录是不会被删除的,有时候需要权限的配置环境作为测试,开发调试的时候不断的修修改改,导致对一下配置没有比较性,

1.使用brew info ngnix查看nginx安装是安装文件的地方,这里我们关心两个地方,一个是www目录,另外一个则是配置目录/etc/nginx

同上面的信息能够很清楚的知道Nginx相关的配置文件的信息使用brew uninstall nginx卸载nginx,此时目录服务器上还留有nginx相关的文件,我们需要手动删除www、etc目录 删除配置文件: /usr/local/etc/nginx 目录,

自己的源代码所在目录: /usr/local/var/www , 不想要可以删除此目录

iOS集成 FFMEPG

可用的直播流地址

1,RTMP协议直播源

1
香港卫视:rtmp://live.hkstv.hk.lxdns.com/live/hks

2,RTSP协议直播源

1
2
3
珠海过澳门大厅摄像头监控:rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp

大熊兔(点播):rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov

3,HTTP协议直播源

1
2
3
4
5
6
7
香港卫视:http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8
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