Linux下视频流媒体服务器搭建详解_lnuix 配置媒体服务器-程序员宅基地

目标用于搭建内网流媒体服务器支持视频的点播。

背景

用于支持培训网站中视频点拨功能,在培训网站总体方案中需要加入流媒体服务器,用于存储和传输视频资源。

相关概念

  • 流媒体
    流媒体(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协议播放
  1. 首先从github下载已编译版本,因为在Linux上安装使用,直接下载 red5-server-1.0.7-RELEASE.tar.gz文件即可。
  2. Java程序,在服务器上安装jre1.7版本后即可解压运行。测试阶段可以使用./red5-debug.sh启动red5服务器。在浏览器上输入http://[serverip]:5080/可以看到red5控制主页。
  3. 在red5安装目录下的webapp/vod目录下的视频文件可以在本地VLC播放器上连接http://[serverip]:5080/[filename]进行播放。

Darwin Streaming Server

功能同easyDarwin,在Linux上安装比较繁琐,所以暂时只试用easyDarwin。

easyDarwin

使用RTSP协议播放
  1. 首先从github下载源码或者已编译版本,因为上面有CentOS已编译版本,直接下载解压即可使用。
  2. 使用root账户启动执行程序,首次启动迁移开启调试模式,./easydarwin -c ./easydarwin.xml -d
  3. 启动后,可以在执行的从终端看到调试信息。同时使用http://[serverip]:8088可以登录,默认使用admin/admin登录。
  4. 在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;
        }

即可使用播放器打开远程连接。

hlr_playback

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: Win32 */
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;

}

  • 使用jwplayer实现http播放

在网站上下载一个jwplayer,解压后上传至/var/www/html目录,然后就可以在浏览器直接访问以h264编码的mp4文件或flv文件。

此方法的兼容性较好,在IE, Chrome, Firefox, Safari输入地址http://192.168.40.134/player.swf?type=http&file=sample_h264_100kbit.mp4,视频都可以直接打开。

效果如下图所示:

ie_jwplayer

不过这样的播放方式,要求在地址栏输入一长串的地址,优雅一点的方法是写一个页面放在网站目录下,然后通过访问页面来播放嵌套其中的视频。

如下建立一个index.html文件。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>test of nginx-http</title>
</head>
<body>
<div id="myElement"></div>
<object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="480" height="360">
  <param name="movie" value="player.swf"/>
  <param name="quality" value="high"/>
  <param name="wmode" value="opaque"/>
  <param name="swfversion" value="6.0.65.0"/>
  <EMBED SRC="player.swf" WIDTH="480" HEIGHT="360" QUALITY="high" flashvars="type=http&file=/magicleap2.flv&autostart=true" wmode="opaque"/></object>
</body>
</html>

其中flv文件如果要支持拖动,需要对文件添加关键帧,方法如下:

yamdi -i magicleap.flv -o magicleap2.flv

然后通过浏览器访问这个地址http://192.168.40.134/index.html。可以看到视频实现在页面中的播放。

ie_jwplayer_page

Nginx + RMTP模块
  • 测试RTMP直播功能
    提示:测试RTMP功能可以参考nginx-rtmp-module中的test目录。
# 写入nginx.conf文件,rtmp协议专用1935端口
rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        application vod {
            play /var/www/vod; # vod file location
        }
        application live { 
            live on;

         }
    access_log logs/rtmp_access.log; 
    }
}

在本地的VLC打开rtmp地址rtmp://192.168.40.134/live/mystream。
在远程主机上使用ffmpeg命令模拟一个视频流推送给VLC。这种推流的方式实际就是所谓的直播了。

ffmpeg -loglevel verbose -re -i /var/www/html/a_day_with_htc_vive.avi  -f flv rtmp://localhost/live/mystream

ffmpeg –i/usr/local/nginx/vod/flvs/a.flv-strict -2 -c:v libx264 -c:a aac -f flv rtmp://192.168.10.4/live/test

一旦远程主机上的转换开始,VLC开始缓冲几秒后就会开始播放,如下图所示。

vlc_rtmp_receive

  • 在http模块中配置RTMP虚拟机(server)实现点播功能

实现方法是用jwplayer调用rtmp的流实现视频播放。如下html实现对视频的嵌入播放。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>nginx-rtmp</title>
</head>

<body>
<div id="myElement"></div>
<object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="480" height="360">
  <param name="movie" value="player.swf" />
  <param name="quality" value="high" />
  <param name="wmode" value="opaque" />
  <param name="swfversion" value="6.0.65.0" />  <EMBED SRC="player.swf" WIDTH="480" HEIGHT="360" QUALITY="high" flashvars="streamer=rtmp://192.168.40.134:1935/vod&file=magicleap2.flv&autostart=true" wmode="o
paque" />
</object>
</body>
</html>

播放效果如下:

ie_jwplayer_rmtp_page

通过这个RTMP流的优势是,可以避免视频文件被浏览器通过http方式进行下载。

视频文件存储

所有流服务器存储媒体文件的方式都是将文件放在指定目录下面,且磁盘系统绝大部分I/O都是读操作,写操作只会发生在上传和更新媒体文件过程中。对于这种I/O操作特性,建议选择RAID 5用于中小规模的视频点拨服务。这样可以提供比独立磁盘更高的数据安全性和读取速度,同时将成本控制在较小的范围内。实际可用容量为(N-1)个磁盘。

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-03/142101.htm


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zalan01408980/article/details/79684422

智能推荐

linux devkmem 源码,linux dev/mem dev/kmem实现访问物理/虚拟内存-程序员宅基地

文章浏览阅读451次。dev/mem: 物理内存的全镜像。可以用来访问物理内存。/dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。调试嵌入式Linux内核时,可能需要查看某个内核变量的值。/dev/kmem正好提供了访问内核虚拟内存的途径。现在的内核大都默认禁用了/dev/kmem,打开的方法是在 make menuconfig中选中 device drivers --> ..._dev/mem 源码实现

vxe-table 小众但功能齐全的vue表格组件-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏19次。vxe-table,一个小众但功能齐全并支持excel操作的vue表格组件_vxe-table

(开发)bable - es6转码-程序员宅基地

文章浏览阅读62次。参考:http://www.ruanyifeng.com/blog/2016/01/babel.htmlBabelBabel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行// 转码前input.map(item => item + 1);// 转码后input.map(function (item) { return item..._让开发环境支持bable

FPGA 视频处理 FIFO 的典型应用_fpga 频分复用 视频-程序员宅基地

文章浏览阅读2.8k次,点赞6次,收藏29次。摘要:FPGA视频处理FIFO的典型应用,视频输入FIFO的作用,视频输出FIFO的作用,视频数据跨时钟域FIFO,视频缩放FIFO的作用_fpga 频分复用 视频

R语言:设置工作路径为当前文件存储路径_r语言设置工作目录到目标文件夹-程序员宅基地

文章浏览阅读575次。【代码】R语言:设置工作路径为当前文件存储路径。_r语言设置工作目录到目标文件夹

background 线性渐变-程序员宅基地

文章浏览阅读452次。格式:background: linear-gradient(direction, color-stop1, color-stop2, ...);<linear-gradient> = linear-gradient([ [ <angle> | to <side-or-corner>] ,]? &l..._background线性渐变

随便推点

【蓝桥杯省赛真题39】python输出最大的数 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析-程序员宅基地

文章浏览阅读1k次,点赞26次,收藏8次。第十三届蓝桥杯青少年组python编程省赛真题一、题目要求(注:input()输入函数的括号中不允许添加任何信息)1、编程实现给定一个正整数N,输出正整数N中各数位最大的那个数字。例如:N=132,则输出3。2、输入输出输入描述:只有一行,输入一个正整数N输出描述:只有一行,输出正整数N中各数位最大的那个数字输入样例:

网络协议的三要素-程序员宅基地

文章浏览阅读2.2k次。一个网络协议主要由以下三个要素组成:1.语法数据与控制信息的结构或格式,包括数据的组织方式、编码方式、信号电平的表示方式等。2.语义即需要发出何种控制信息,完成何种动作,以及做出何种应答,以实现数据交换的协调和差错处理。3.时序即事件实现顺序的详细说明,以实现速率匹配和排序。不完整理解:语法表示长什么样,语义表示能干什么,时序表示排序。转载于:https://blog.51cto.com/98..._网络协议三要素csdn

The Log: What every software engineer should know about real-time data's unifying abstraction-程序员宅基地

文章浏览阅读153次。主要的思想,将所有的系统都可以看作两部分,真正的数据log系统和各种各样的query engine所有的一致性由log系统来保证,其他各种query engine不需要考虑一致性,安全性,只需要不停的从log系统来同步数据,如果数据丢失或crash可以从log系统replay来恢复可以看出kafka系统在linkedin中的重要地位,不光是d..._the log: what every software engineer should know about real-time data's uni

《伟大是熬出来的》冯仑与年轻人闲话人生之一-程序员宅基地

文章浏览阅读746次。伟大是熬出来的  目录  前言  引言 时间熬成伟大:领导者要像狼一样坚忍   第一章 内圣外王——领导者的心态修炼  1. 天纵英才的自信心  2. 上天揽月的企图心  3. 誓不回头的决心  4. 宠辱不惊的平常心  5. 换位思考的同理心  6. 激情四射的热心  第二章 日清日高——领导者的高效能修炼  7. 积极主动,想到做到  8. 合理掌控自己的时间和生命  9. 制定目标,马..._当狼拖着受伤的右腿逃生时,右腿会成为前进的阻碍,它会毫不犹豫撕咬断自己的腿, 以

有源光缆AOC知识百科汇总-程序员宅基地

文章浏览阅读285次。在当今的大数据时代,人们对高速度和高带宽的需求越来越大,迫切希望有一种新型产品来作为高性能计算和数据中心的主要传输媒质,所以有源光缆(AOC)在这种环境下诞生了。有源光缆究竟是什么呢?应用在哪些领域,有什么优势呢?易天将为您解答!有源光缆(Active Optical Cables,简称AOC)是两端装有光收发器件的光纤线缆,主要构成部件分为光路和电路两部分。作为一种高性能计..._aoc 光缆

浏览器代理服务器自动配置脚本设置方法-程序员宅基地

文章浏览阅读2.2k次。在“桌面”上按快捷键“Ctrl+R”,调出“运行”窗口。接着,在“打开”后的输入框中输入“Gpedit.msc”。并按“确定”按钮。如下图 找到“用户配置”下的“Windows设置”下的“Internet Explorer 维护”的“连接”,双击选择“自动浏览器配置”。如下图 选择“自动启动配置”,并在下面的“自动代理URL”中填写相应的PAC文件地址。如下..._設置proxy腳本