目标用于搭建内网流媒体服务器支持视频的点播。
背景
用于支持培训网站中视频点拨功能,在培训网站总体方案中需要加入流媒体服务器,用于存储和传输视频资源。
相关概念
- 流媒体
流媒体(Streaming Media)是一种新兴的网络传输技术,在互联网上实时顺序地传输和播放视/音频等多媒体内容的连续时基数据流。
流媒体技术包括流媒体数据采集、视/音频编解码、存储、传输、播放等领域。
流媒体系统组成
包括编码工具、流媒体数据、服务器、网络和播放器。流媒体传输过程
如下图所示:
- 传输协议
RSVP: 资源预留协议
RTP: 实时传输协议
RTCP: 实时传输控制协议
MMS: 微软流媒体服务协议
RTSP: 实时流协议
RTMP: 实时消息传输协议
MIME: 多目因特网电子邮件扩展协议
解决方案
商业方案
Real Network的Real System
-
服务端软件:Helix Server
-
平台:Windows or Linux
-
文件格式:RealAudio, Realvideo, RealFlash
-
微软的Windows Media Services
-
服务端软件:Windows Media Server
-
平台:Windows
-
文件格式:ASF, WMV
-
苹果公司的Quick Time系列
-
服务端软件:QuickTime Streaming Server (开源版本为Darwin Streaming Server)
-
平台:MacOS X, Linux, Windows
-
文件格式:MOV, MP4
-
在这三家公司的流媒体产品中,RealNetworks公司的免费服务端Helix Server Basic最大提供个流的并发,仅支持其专有编码RealAudio和RealVideo,基本上只能算是体验性的产品;微软公司的流媒体服务端Windows Media Server附带于其服务器产品Windows Server中,但只有最高版本的Windows Server Enterprice才具有完整的包括组播在内的所有流媒体服务器功能;苹果公司的Darwin Streaming Server(简称DSS)完全免费,没有任何功能限制,且符合国际标准。
开源/免费解决方案
ffmpeg
-
全平台视频转换
-
开源
-
RED5
-
Red5是一个采用Java开发开源的Flash流媒体服务器。它支持:把音频( MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录制,flash流媒体播放,在线聊天,视频会议等一些基本功能。
-
开源地址:[](https: //github.com/Red5/red5-server)
-
Darwin Streaming Server
为苹果公司视频流解决方案的开源版本。
easyDarwin
国内基于Darwin Streaming Server二次开发的流媒体服务器,有中文支持网站。
安装配置
RED5
使用HTTP协议播放
- 首先从github下载已编译版本,因为在Linux上安装使用,直接下载 red5-server-1.0.7-RELEASE.tar.gz文件即可。
- Java程序,在服务器上安装jre1.7版本后即可解压运行。测试阶段可以使用
./red5-debug.sh
启动red5服务器。在浏览器上输入http://[serverip]:5080/可以看到red5控制主页。 - 在red5安装目录下的webapp/vod目录下的视频文件可以在本地VLC播放器上连接http://[serverip]:5080/[filename]进行播放。
Darwin Streaming Server
功能同easyDarwin,在Linux上安装比较繁琐,所以暂时只试用easyDarwin。
easyDarwin
使用RTSP协议播放
- 首先从github下载源码或者已编译版本,因为上面有CentOS的已编译版本,直接下载解压即可使用。
- 使用root账户启动执行程序,首次启动迁移开启调试模式,
./easydarwin -c ./easydarwin.xml -d
。 - 启动后,可以在执行的从终端看到调试信息。同时使用http://[serverip]:8088可以登录,默认使用admin/admin登录。
- 在Movies目录下放置一些视频文件,就可以在客户端使用播放器进行播放,我测试使用的是VLC。
Nginx + HLS
HLSHTTP Live Streaming苹果公司开放的支持html5直接播放的视频流技术。
Nginx实现http服务器功能,可以通过http访问m3u8文件实现播放。
要使用HLS播放的第一步,是将视频文件切割成多个ts视频流,然后使用m3u8索引文件进行播放。生成m3u8和ts文件可以借助ffmpeg工具,使用如下命令就可以将一般的视频文件转换成HLS支持的文件。
ffmpeg -i "G:\video\7 magic leap2.avi" -f hls "G:\video\HLR\test.m3u8"
对于大文件用上面这种方式有可能出现m3u8缺少索引的情况,因此也可以使用以下的方式对文件进行转换。
ffmpeg -i bigfile.mp4 -codec:v libx264 -codec:a aac -map 0 -f ssegment -segment_format mpegts -segment_list tos.m3u8 -segment_time 10 taste_of_shanghai%04d.ts
直接使用Nginx访问文件路径
不需要多余的软件,直接将m3u8文件所在目录设置为http server的根目录。
-
server {
-
listen
80;
-
server_name localhost;
-
-
#charset koi8-r;
-
-
#access_log logs/host.access.log main;
-
-
location / {
-
# root html;
-
root /var/www/html;
-
index index.html index.htm;
-
}
即可使用播放器打开远程连接。
Nginx + jwplayer
Nginx编译时增加mp4和flv模块,可以让Nginx支持flv和mp4格式。为了后面说明支持RMTP协议,同时在增加RTMP模块。
- 安装依赖包
yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel expat-devel gettext-devel libtool mhash.x86_64 perl-Digest-SHA1.x86_64
-
tar xzvf zlib
-1.2
.8.tar.gz
-
cd zlib
-1.2
.8
-
./configure
-
make
-
make install
-
tar xzvf pcre
-8.37.tar.gz
-
cd pcre
-8.37
-
./configure
-
make
-
make install
-
tar xzvf yamdi-
1.9.tar.gz
-
cd yamdi-
1.9
-
./cofigure
-
gcc yamdi.
c -o yamdi -
O2 -
Wall
-
tar xzvf openssl
-1.0
.1t.tar.gz
-
cd openssl
-1.0
.1t
-
./config
-
make depend
-
make install
- 安装ffmpeg以及依赖包
需要安装yasm, x264, LAME, libogg,libvorbis, libvpx, faad2, faac
-
# 汇编工具
-
# 请网络搜索安装包
-
unzip
yasm-1
.2
.0-1
.el6
.x86_64
.zip
-
rpm
-ivh
yasm-1
.2
.0-1
.el6
.x86_64
.rpm
-
# h.264编码
-
# http videolan.org
-
tar xjvf last_x264.tar.bz2
-
cd x264-snapshot-
20160718-
2245
-
./configure --
enable-shared
-
make
-
make
install
-
# LAME mp3编码器
-
wget
http:/
/downloads.sourceforge.net/project
/lame/lame
/3.99/lame-
3.99.
5.tar.gz
-
tar xzvf lame-
3.99.
5.tar.gz
-
cd lame-
3.99.
5
-
./configure --enable-nasm
-
make
-
make install
-
# libogg 音频编码器
-
wget http:
//downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
-
tar xzvf libogg
-1.3
.2.tar.gz
-
cd libogg
-1.3
.2
-
./configure
-
make
-
make install
-
# libvorbis 音频编码器
-
wget http:
//downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
-
tar xzvf libvorbis
-1.3
.5.tar.gz
-
cd libvorbis
-1.3
.5
-
./configure
-
make
-
make install
-
# libvpx VP8编码解码器
-
# 网络搜索
-
tar xjvf libvpx-
1.5.
0.tar.bz2
-
cd libvpx-
1.5.
0
-
./configure --
enable-shared
-
make
-
make
install
-
# FAAD2 MPEG-2和AAC格式的编解码器
-
wget http:
//downloads.sourceforge.net/
project
/faac/faad2-src/faad2-
2.7
/faad2-
2.7
.tar.gz
-
tar xzvf faad2
-
2.7.tar.gz
-
cd faad2
-
2.7
-
./configure
-
make
-
make
install
-
# faac AAC编解码器
-
wget http:
//downloads.sourceforge.net/
project
/faac/faac-src/faac-
1.28
/faac-
1.28
.tar.gz
-
tar xzvf faac
-
1.28.tar.gz
-
cd faac
-
1.28
-
./configure
-
make
-
make
install
-
# xvid 视频编码
-
wget http:
//downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
-
tar zxvf xvidcore
-1.3
.2.tar.gz
-
cd xvidcore/build/generic
-
./configure
-
make
-
make install
-
# ffmpeg 转换工具
-
wget http://ffmpeg.org/releases/ffmpeg
-3.1
.1.tar.bz2
-
tar xjvf ffmpeg
-3.1
.1.tar.bz2
-
cd ffmpeg
-3.1
.1
-
./configure
--prefix=/opt/ffmpeg/ \
-
--enable-version3 \
-
--enable-libvpx \
-
--enable-libfaac \
-
--enable-libmp3lame \
-
--enable-libvorbis \
-
--enable-libx264 \
-
--enable-libxvid \
-
--enable-shared \
-
--enable-gpl \
-
--enable-postproc \
-
--enable-nonfree \
-
--enable-avfilter \
-
--enable-pthreads
-
-
make
-
# 可以忽略编译过程中的警告信息
-
make install
- 修改
/etc/ld.so.conf
-
inclue ld.so.conf.d/*.conf
-
/
lib
-
/lib64
-
/usr/
lib
-
/usr/lib64
-
/usr/local/
lib
-
/usr/local/lib64
-
/opt/ffmpeg/
lib
执行ldconfig
使修改生效。
- 编码测试
ffmpeg -i ./a_day_with_htc_vive.avi -f hls ./htcvive.m3u8
- 编译Nginx
-
wget http:
//h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
-
tar xzvf nginx_mod_h264_streaming
-2.2
.7.tar.gz
-
-
# https://github.com/arut/nginx-rtmp-module
-
unzip nginx-rtmp-
module-master.zip
-
vi nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c
-
# 注释以下内容
-
/* TODO: W
in32 */
-
if (r->zero_
in_uri)
-
{
-
return NGX_DECLINED;
-
-
}
-
groupadd nginx
-
useradd nginx
-
usermod -G nginx nginx
-
tar zxf nginx
-1.8
.0.tar.gz
-
cd nginx
-1.8
.0
-
./configure --prefix=
/usr/local/nginx \
-
--add-
module=
/opt/video/nginx_mod_h264_streaming
-2.2
.7 \
-
--
with-http_flv_module \
-
--
with-http_ssl_module \
-
--
with-http_mp4_module \
-
--
with-http_gzip_static_module \
-
--
with-http_stub_status_module \
-
--
with-pcre=
/opt/video/pcre
-8.37 \
-
--
with-zlib=
/opt/video/zlib
-1.2
.8 \
-
--user=nginx --group=nginx \
-
--add-
module=
/opt/video/nginx-rtmp-
module-master \
-
--
with-cc-opt=-I/opt/ffmpeg/include \
-
--
with-ld-opt=-L/opt/ffmpeg/lib-R/opt/ffmpeg/lib
-
-
make
-
make install
- 配置nginx.conf文件
-
server {
-
listen
80;
-
server_name localhost;
-
-
#charset koi8-r;
-
-
#access_log logs/host.access.log main;
-
-
location / {
-
root /var/www/html;
-
index
index.html
index.htm;
-
location ~ \.flv$
-
{
-
flv;
-
}
-
location ~ \.mp4$
-
{
-
mp4;
-
}
-
}
-
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
-
root /var/www/html;
-
break;
-
}
目标用于搭建内网流媒体服务器支持视频的点播。
背景
用于支持培训网站中视频点拨功能,在培训网站总体方案中需要加入流媒体服务器,用于存储和传输视频资源。
相关概念
- 流媒体
流媒体(Streaming Media)是一种新兴的网络传输技术,在互联网上实时顺序地传输和播放视/音频等多媒体内容的连续时基数据流。
流媒体技术包括流媒体数据采集、视/音频编解码、存储、传输、播放等领域。
流媒体系统组成
包括编码工具、流媒体数据、服务器、网络和播放器。流媒体传输过程
如下图所示:
- 传输协议
RSVP: 资源预留协议
RTP: 实时传输协议
RTCP: 实时传输控制协议
MMS: 微软流媒体服务协议
RTSP: 实时流协议
RTMP: 实时消息传输协议
MIME: 多目因特网电子邮件扩展协议
解决方案
商业方案
Real Network的Real System
-
服务端软件:Helix Server
-
平台:Windows or Linux
-
文件格式:RealAudio, Realvideo, RealFlash
-
微软的Windows Media Services
-
服务端软件:Windows Media Server
-
平台:Windows
-
文件格式:ASF, WMV
-
苹果公司的Quick Time系列
-
服务端软件:QuickTime Streaming Server (开源版本为Darwin Streaming Server)
-
平台:MacOS X, Linux, Windows
-
文件格式:MOV, MP4
-
在这三家公司的流媒体产品中,RealNetworks公司的免费服务端Helix Server Basic最大提供个流的并发,仅支持其专有编码RealAudio和RealVideo,基本上只能算是体验性的产品;微软公司的流媒体服务端Windows Media Server附带于其服务器产品Windows Server中,但只有最高版本的Windows Server Enterprice才具有完整的包括组播在内的所有流媒体服务器功能;苹果公司的Darwin Streaming Server(简称DSS)完全免费,没有任何功能限制,且符合国际标准。
开源/免费解决方案
ffmpeg
-
全平台视频转换
-
开源
-
RED5
-
Red5是一个采用Java开发开源的Flash流媒体服务器。它支持:把音频( MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录制,flash流媒体播放,在线聊天,视频会议等一些基本功能。
-
开源地址:[](https: //github.com/Red5/red5-server)
-
Darwin Streaming Server
为苹果公司视频流解决方案的开源版本。
easyDarwin
国内基于Darwin Streaming Server二次开发的流媒体服务器,有中文支持网站。
安装配置
RED5
使用HTTP协议播放
- 首先从github下载已编译版本,因为在Linux上安装使用,直接下载 red5-server-1.0.7-RELEASE.tar.gz文件即可。
- Java程序,在服务器上安装jre1.7版本后即可解压运行。测试阶段可以使用
./red5-debug.sh
启动red5服务器。在浏览器上输入http://[serverip]:5080/可以看到red5控制主页。 - 在red5安装目录下的webapp/vod目录下的视频文件可以在本地VLC播放器上连接http://[serverip]:5080/[filename]进行播放。
Darwin Streaming Server
功能同easyDarwin,在Linux上安装比较繁琐,所以暂时只试用easyDarwin。
easyDarwin
使用RTSP协议播放
- 首先从github下载源码或者已编译版本,因为上面有CentOS的已编译版本,直接下载解压即可使用。
- 使用root账户启动执行程序,首次启动迁移开启调试模式,
./easydarwin -c ./easydarwin.xml -d
。 - 启动后,可以在执行的从终端看到调试信息。同时使用http://[serverip]:8088可以登录,默认使用admin/admin登录。
- 在Movies目录下放置一些视频文件,就可以在客户端使用播放器进行播放,我测试使用的是VLC。
Nginx + HLS
HLSHTTP Live Streaming苹果公司开放的支持html5直接播放的视频流技术。
Nginx实现http服务器功能,可以通过http访问m3u8文件实现播放。
要使用HLS播放的第一步,是将视频文件切割成多个ts视频流,然后使用m3u8索引文件进行播放。生成m3u8和ts文件可以借助ffmpeg工具,使用如下命令就可以将一般的视频文件转换成HLS支持的文件。
ffmpeg -i "G:\video\7 magic leap2.avi" -f hls "G:\video\HLR\test.m3u8"
对于大文件用上面这种方式有可能出现m3u8缺少索引的情况,因此也可以使用以下的方式对文件进行转换。
ffmpeg -i bigfile.mp4 -codec:v libx264 -codec:a aac -map 0 -f ssegment -segment_format mpegts -segment_list tos.m3u8 -segment_time 10 taste_of_shanghai%04d.ts
直接使用Nginx访问文件路径
不需要多余的软件,直接将m3u8文件所在目录设置为http server的根目录。
-
server {
-
listen
80;
-
server_name localhost;
-
-
#charset koi8-r;
-
-
#access_log logs/host.access.log main;
-
-
location / {
-
# root html;
-
root /var/www/html;
-
index index.html index.htm;
-
}
即可使用播放器打开远程连接。
Nginx + jwplayer
Nginx编译时增加mp4和flv模块,可以让Nginx支持flv和mp4格式。为了后面说明支持RMTP协议,同时在增加RTMP模块。
- 安装依赖包
yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel expat-devel gettext-devel libtool mhash.x86_64 perl-Digest-SHA1.x86_64
-
tar xzvf zlib
-1.2
.8.tar.gz
-
cd zlib
-1.2
.8
-
./configure
-
make
-
make install
-
tar xzvf pcre
-8.37.tar.gz
-
cd pcre
-8.37
-
./configure
-
make
-
make install
-
tar xzvf yamdi-
1.9.tar.gz
-
cd yamdi-
1.9
-
./cofigure
-
gcc yamdi.
c -o yamdi -
O2 -
Wall
-
tar xzvf openssl
-1.0
.1t.tar.gz
-
cd openssl
-1.0
.1t
-
./config
-
make depend
-
make install
- 安装ffmpeg以及依赖包
需要安装yasm, x264, LAME, libogg,libvorbis, libvpx, faad2, faac
-
# 汇编工具
-
# 请网络搜索安装包
-
unzip
yasm-1
.2
.0-1
.el6
.x86_64
.zip
-
rpm
-ivh
yasm-1
.2
.0-1
.el6
.x86_64
.rpm
-
# h.264编码
-
# http videolan.org
-
tar xjvf last_x264.tar.bz2
-
cd x264-snapshot-
20160718-
2245
-
./configure --
enable-shared
-
make
-
make
install
-
# LAME mp3编码器
-
wget
http:/
/downloads.sourceforge.net/project
/lame/lame
/3.99/lame-
3.99.
5.tar.gz
-
tar xzvf lame-
3.99.
5.tar.gz
-
cd lame-
3.99.
5
-
./configure --enable-nasm
-
make
-
make install
-
# libogg 音频编码器
-
wget http:
//downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
-
tar xzvf libogg
-1.3
.2.tar.gz
-
cd libogg
-1.3
.2
-
./configure
-
make
-
make install
-
# libvorbis 音频编码器
-
wget http:
//downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
-
tar xzvf libvorbis
-1.3
.5.tar.gz
-
cd libvorbis
-1.3
.5
-
./configure
-
make
-
make install
-
# libvpx VP8编码解码器
-
# 网络搜索
-
tar xjvf libvpx-
1.5.
0.tar.bz2
-
cd libvpx-
1.5.
0
-
./configure --
enable-shared
-
make
-
make
install
-
# FAAD2 MPEG-2和AAC格式的编解码器
-
wget http:
//downloads.sourceforge.net/
project
/faac/faad2-src/faad2-
2.7
/faad2-
2.7
.tar.gz
-
tar xzvf faad2
-
2.7.tar.gz
-
cd faad2
-
2.7
-
./configure
-
make
-
make
install
-
# faac AAC编解码器
-
wget http:
//downloads.sourceforge.net/
project
/faac/faac-src/faac-
1.28
/faac-
1.28
.tar.gz
-
tar xzvf faac
-
1.28.tar.gz
-
cd faac
-
1.28
-
./configure
-
make
-
make
install
-
# xvid 视频编码
-
wget http:
//downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
-
tar zxvf xvidcore
-1.3
.2.tar.gz
-
cd xvidcore/build/generic
-
./configure
-
make
-
make install
-
# ffmpeg 转换工具
-
wget http://ffmpeg.org/releases/ffmpeg
-3.1
.1.tar.bz2
-
tar xjvf ffmpeg
-3.1
.1.tar.bz2
-
cd ffmpeg
-3.1
.1
-
./configure
--prefix=/opt/ffmpeg/ \
-
--enable-version3 \
-
--enable-libvpx \
-
--enable-libfaac \
-
--enable-libmp3lame \
-
--enable-libvorbis \
-
--enable-libx264 \
-
--enable-libxvid \
-
--enable-shared \
-
--enable-gpl \
-
--enable-postproc \
-
--enable-nonfree \
-
--enable-avfilter \
-
--enable-pthreads
-
-
make
-
# 可以忽略编译过程中的警告信息
-
make install
- 修改
/etc/ld.so.conf
-
inclue ld.so.conf.d/*.conf
-
/
lib
-
/lib64
-
/usr/
lib
-
/usr/lib64
-
/usr/local/
lib
-
/usr/local/lib64
-
/opt/ffmpeg/
lib
执行ldconfig
使修改生效。
- 编码测试
ffmpeg -i ./a_day_with_htc_vive.avi -f hls ./htcvive.m3u8
- 编译Nginx
-
wget http:
//h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
-
tar xzvf nginx_mod_h264_streaming
-2.2
.7.tar.gz
-
-
# https://github.com/arut/nginx-rtmp-module
-
unzip nginx-rtmp-
module-master.zip
-
vi nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c
-
# 注释以下内容
-
/* TODO: W
in32 */
-
if (r->zero_
in_uri)
-
{
-
return NGX_DECLINED;
-
-
}
-
groupadd nginx
-
useradd nginx
-
usermod -G nginx nginx
-
tar zxf nginx
-1.8
.0.tar.gz
-
cd nginx
-1.8
.0
-
./configure --prefix=
/usr/local/nginx \
-
--add-
module=
/opt/video/nginx_mod_h264_streaming
-2.2
.7 \
-
--
with-http_flv_module \
-
--
with-http_ssl_module \
-
--
with-http_mp4_module \
-
--
with-http_gzip_static_module \
-
--
with-http_stub_status_module \
-
--
with-pcre=
/opt/video/pcre
-8.37 \
-
--
with-zlib=
/opt/video/zlib
-1.2
.8 \
-
--user=nginx --group=nginx \
-
--add-
module=
/opt/video/nginx-rtmp-
module-master \
-
--
with-cc-opt=-I/opt/ffmpeg/include \
-
--
with-ld-opt=-L/opt/ffmpeg/lib-R/opt/ffmpeg/lib
-
-
make
-
make install
- 配置nginx.conf文件
-
server {
-
listen
80;
-
server_name localhost;
-
-
#charset koi8-r;
-
-
#access_log logs/host.access.log main;
-
-
location / {
-
root /var/www/html;
-
index
index.html
index.htm;
-
location ~ \.flv$
-
{
-
flv;
-
}
-
location ~ \.mp4$
-
{
-
mp4;
-
}
-
}
-
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
-
root /var/www/html;
-
break;
-
}