阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

CentOS6下基于Nginx搭建mp4/flv流媒体服务器

427次阅读
没有评论

共计 10617 个字符,预计需要花费 27 分钟才能阅读完成。

CentOS6 下基于 Nginx 搭建 mp4/flv 流媒体服务器 (可随意拖动) 并支持 RTMP/HLS 协议(含转码工具)

1. 先添加几个 RPM 下载源

    1.1)安装 RPMforge 的 CentOS6 源
    [root@linuxidc ~]# wget -c http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
      [root@linuxidc ~]# rpm –import http://apt.sw.be/RPM-GPG-KEY.dag.txt
      [root@linuxidc ~]# rpm -i rpmforge-release-0.5.3-1.el6.rf.*.rpm   

    1.2)安装 epel 源
    [root@linuxidc ~]# wget -c http://download.Fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
      [root@linuxidc ~]# rpm -Uvf epel-release-6-8.noarch.rpm

    安装完成,查看一下源列表,看到 rpmforge 和 epel 字样即可
    [root@linuxidc ~]# ls -lh /etc/yum.repos.d

2. 安装转码工具 Mencoder 及 ffmpeg(约定:每个小点操作之前先回到用户主目录,即 cd ~)

    2.1)安装一些基础包,不用担心重复,已经存在的会自动忽略或升级
    [root@linuxidc ~]# yum install gcc make automake bzip2 unzip patch subversion libjpeg-devel
      [root@linuxidc ~]# wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
      [root@linuxidc ~]# tar zxvf yasm-1.2.0.tar.gz
      [root@linuxidc ~]# cd yasm-1.2.0
      [root@linuxidc yasm-1.2.0]# ./configure
      [root@linuxidc yasm-1.2.0]# make && make install
      [root@linuxidc yasm-1.2.0]# cd ~
     
      2.2) 卸载系统原有的 ffmgeg 和 x.264,没有则跳过
    [root@linuxidc ~]# yum remove ffmpeg x264

    2.3)先安装一些 Mplayer 编码库(仅限于 64 位系统)
      [root@linuxidc ~]# wget -c http://www2.mplayerhq.hu/MPlayer/releases/codecs/essential-amd64-20071007.tar.bz2
      上面这一步可能在部分 VPS 上无法下载,比如我的阿里云 VPS 就提示连接失败,但是可以用本机浏览器下载后上传到 VPS 的 /root 根目录去,然后继续下面的操作
    [root@linuxidc ~]# tar xvjf essential-amd64-20071007.tar.bz2
      [root@linuxidc ~]# mkdir /usr/local/lib/codecs
      [root@linuxidc ~]# cp -Rvp essential-amd64-20071007/* /usr/local/lib/codecs/

    编辑下面文件
    [root@linuxidc ~]# vim /etc/ld.so.conf
      添加以下两行到上面的文件里
    /usr/lib
      /usr/local/lib
     
      2.4) 再安装一些格式转换常用的编码库
    [root@linuxidc ~]# yum install faac-devel  lame-devel amrnb-devel opencore-amr-devel amrwb-devel  libvorbis-devel libtheora-devel xvidcore-devel
     
      2.5) 安装 x.264
      [root@linuxidc ~]# wget ftp://ftp.videolan.org/pub/videolan/x264/snapshots/last_stable_x264.tar.bz2
      [root@linuxidc ~]# tar xvjf last_stable_x264.tar.bz2
      [root@linuxidc ~]# cd x264-snapshot-20140219-2245-stable/(这可能日期有区别,自己 ls 一下)
    [root@linuxidc x264-snapshot-20140219-2245-stable]# ./configure –enable-shared –enable-pic
      [root@linuxidc x264-snapshot-20140219-2245-stable]# make && make install
      [root@linuxidc x264-snapshot-20140219-2245-stable]#  cd ~

    2.6)安装 libvpx
      [root@linuxidc ~]# wget http://webm.googlecode.com/files/libvpx-v1.2.0.tar.bz2
      [root@linuxidc ~]# tar xvjf libvpx-v1.2.0.tar.bz2
      [root@linuxidc ~]# cd libvpx-v1.2.0
      [root@linuxidc libvpx-v1.2.0]# ./configure –enable-shared –enable-pic
      [root@linuxidc libvpx-v1.2.0]# make && make install
      [root@linuxidc libvpx-v1.2.0]# cd ~

    2.7)安装 FFmpeg
      [root@linuxidc ~]# wget http://ffmpeg.org/releases/ffmpeg-2.0.1.tar.bz2
      [root@linuxidc ~]# tar xvjf ffmpeg-2.0.1.tar.bz2
      [root@linuxidc ~]# cd ffmpeg-2.0.1
      [root@linuxidc ffmpeg-2.0.1]# ./configure –enable-gpl –enable-version3 –enable-shared –enable-nonfree –enable-postproc –enable-libfaac –enable-libmp3lame –enable-libopencore-amrnb –enable-libopencore-amrwb –enable-libtheora –enable-libvorbis –enable-libvpx –enable-libx264 –enable-libxvid
      [root@linuxidc ffmpeg-2.0.1]# make && make install
      [root@linuxidc ffmpeg-2.0.1]# cd ~
     
      让动态链接库被系统共享
    [root@linuxidc ~]# ldconfig

    2.8)最后安装 mencoder
      [root@linuxidc ~]# yum install mplayer mencoder flvtool2

    查看一下已经安装好的音频和视频编码器
    查看所有所支持的音频编码
    [root@linuxidc ~]# mencoder -oac help
      查看所有所支持的视频编码
    [root@linuxidc ~]# mencoder -ovc help
      具体结果可参考 http://www.mplayerhq.hu/DOCS/HTML/zh_CN/menc-feat-selecting-codec.html

3. 安装配置 Nginx
     
      3.1)先安装各种依赖 (nginx 需要 pcre 支持,yamdi 用来为 flv 创建关键帧才能随意拖动)
      [root@linuxidc ffmpeg-2.0.1]# yum install gcc gcc-c++ openssl-devel zlib-devel pcre pcre-devel yamdi
     
      3.2) 下载所需的 nginx 模块
    第一个是 nginx_mod_h264_streaming,让 nginx 支持 flv/mp4 流播放
    [root@linuxidc ~]# wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
      [root@linuxidc ~]# tar zxvf nginx_mod_h264_streaming-2.2.7.tar.gz
      注意:先要修改一下这家伙的源码,注释掉 nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c 的 158 到 161 行
    /* TODO: Win32 */
      //if (r->zero_in_uri)
      // {
      //  return NGX_DECLINED;
      // }

    第二个是 nginx-rtmp-module,让 nginx 支持 rtmp/hls 协议
    [root@linuxidc ~]# wget -O nginx-rtmp-module.zip  https://github.com/arut/nginx-rtmp-module/archive/master.zip
      [root@linuxidc ~]# unzip nginx-rtmp-module.zip
      下载清缓存的模块
    [root@linuxidc ~]# wget -O ngx_cache_purge.zip https://github.com/FRiCKLE/ngx_cache_purge/archive/master.zip
      [root@linuxidc ~]# unzip ngx_cache_purge.zip
     
      3.3) 下载安装 nginx
      [root@linuxidc ~]# wget http://nginx.org/download/nginx-1.2.9.tar.gz
      [root@linuxidc ~]# tar zxvf nginx-1.2.9.tar.gz
      [root@linuxidc ~]# cd nginx-1.2.9
      [root@linuxidc nginx-1.2.9]# ./configure –user=daemon –group=daemon –prefix=/usr/local/nginx/ –add-module=../nginx-rtmp-module-master –add-module=../ngx_cache_purge-master –add-module=../nginx_mod_h264_streaming-2.2.7 –with-http_stub_status_module –with-http_ssl_module –with-http_sub_module –with-http_gzip_static_module –with-http_flv_module
      [root@linuxidc nginx-1.2.9]# make && make install
      PS: 若提示 make[1]: *** [objs/addon/src/ngx_http_h264_streaming_module.o] Error 1,请参考 3.3.2 小节的注意点,然后重新运行./configure 这一段
     
      /**———以下是安装了 Tengine 后重新编译的代码,模块的路径自己对一下———**//
./configure –user=www –group=www –prefix=/usr/local/tengine/ –add-module=../../../nginx-rtmp-module-master –add-module=../../../ngx_cache_purge-master –add-module=../../../nginx_mod_h264_streaming-2.2.7 –with-http_stub_status_module –with-http_ssl_module –with-http_sub_module –with-http_gzip_static_module –with-http_flv_module –with-http_concat_module=shared –with-http_sysguard_module=shared –with-google_perftools_module –with-http_image_filter_module
     
      运行一下 nginx
      [root@linuxidc ~]# /usr/local/nginx/sbin/nginx
      然后用浏览器你的服务器 IP,看到 welcome 就对了
    或者到 nginx 的 sbin 目录下,运行一下 nginx -V,看看列表出来的 modules 对不对

    3.4)各种配置 nginx
      编辑 /usr/local/nginx/conf/nginx.conf 文件,最好用 sftp 软件 (如 windows 下的 flashfxp/Mac 下的 tramnsmit) 下载过来本地编辑。
    贴一下我的配置文件:(目录需要自己改动,我用的是阿里云的数据盘,所以到 /mnt/ 里面去了)
      ———————————————————————nginx 配置文件—————————————————
    #filename:nginx.conf
    #user  nobody;
    worker_processes  1;

    error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;

    pid        logs/nginx.pid;

    events {
        use epoll;
        worker_connections  1024;
    }

    rtmp {
        server {
            listen 1935;
            chunk_size 4000;

            # video on demand
            application vod {
                play /mnt/media/vod;
            }

            # HLS
            # HLS requires libavformat & should be configured as a separate
            # NGINX module in addition to nginx-rtmp-module:
            # ./configure … –add-module=/path/to/nginx-rtmp-module/hls …
            # For HLS to work please create a directory in tmpfs (/tmp/app here)
            # for the fragments. The directory contents is served via HTTP (see
            # http{} section in config)
            #
            # Incoming stream must be in H264/AAC/MP3. For iPhones use baseline H264
            # profile (see ffmpeg example).
            # This example creates RTMP stream from movie ready for HLS:
            #
            # ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264
            #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
            #    -f flv rtmp://localhost:1935/hls/movie
            #
            # If you need to transcode live stream use‘exec’feature.
            #
            application hls {
                hls on;
                hls_path /mnt/media/app;
                hls_fragment 10s;
            }
        }
    }

    http {

        include mime.types;
        default_type application/octet-stream;
        sendfile on;
        keepalive_timeout 65;
        gzip on;
       
          #log format

        log_format  access‘$remote_addr – $remote_user [$time_local]“$request”‘
‘$status $body_bytes_sent“$http_referer”‘
‘”$http_user_agent”$http_x_forwarded_for’;   
       
          #定义一个名为 addr 的 limit_zone, 大小 10M 内存来存储 session
        limit_conn_zone $binary_remote_addr zone=addr:10m;   

        server {
            listen 8080;
              server_name localhost;

              # HTTP can be used for accessing RTMP stats
            # This URL provides RTMP statistics in XML
            location /stat {
                rtmp_stat all;
                rtmp_stat_stylesheet stat.xsl;
            }
            location /stat.xsl {
                root /mnt/soft/nginx-rtmp-module-master;
            }
              location /control {
                rtmp_control all;
            }
            location / {
                root /mnt/soft/nginx-rtmp-module-master/test/rtmp-publisher;
            }
        }
       
          server {
            listen 80;
              server_name localhost;
             
            location / {
                    root /mnt/wwwroot;
                    index index.html;
                  }       

              location ~ \.flv$ {
                    root /mnt/media/vod;
                  flv;
                  limit_conn addr 20;
                  limit_rate 200k;
            }
            location ~ \.mp4$ {
                  root /mnt/media/vod;
                  mp4;
                  limit_conn addr 20;
                  limit_rate 200k;
            }

              location /hls {
                # Serve HLS fragments
                alias /mnt/media/app;
            }

              access_log  logs/nginxflv_access.log access;
        }
       
           
    }
      ——————————————————nginx 配置文件——————————————
   
4. 把自己的电影转换成 mp4 和 flv 格式来测试 nginx 搭的环境

    4.1)准备两部电影,硬盘上随便找,我找了“谍影重重 A.mp4”和“鹿鼎记 033.rmvb”,尽量找小一点十来分钟的,等下我们还要看完测试一下转换的结果有没有音影不同步的情况。
    我把两部电影重命名为 movie1.mp4 和 movie2.rmvb,并上传到服务器 /mnt/media/video 下面,这里目录用来存放我们的原始视频。还有一个目录是 /mnt/media/vod 用来存放转换后的视频。
    我这里的具体目录结构为:
      /mnt/media/video -> 存放原始视频
    /mnt/media/app  -> 存放转成 m3u8 的视频, 供 http 访问(HLS)
      /mnt/media/vod  -> 存放转换后的 flv 和 mp4 视频, 供 http 或 rtmp 访问

    4.2)用 ffmpeg 转换 mp4 文件(ffmpeg 不支持 rmvb)
      [root@linuxidc ~]# cd /mnt/media/video/
      [root@linuxidc video]# ffmpeg -i movie1.mp4 -y -vcodec libx264 -vf scale=”640:-1″ -r 15 -acodec libfaac ../vod/movie1.flv
      -y: 文件覆盖,-vf scale=”640:-1”: 尺寸调整为宽度 640 高度自动,-r 15: 帧数 15fps,这里用 libfaac 音频编码防止转成 ts 格式时 iPhone 没有声音
   
      添加关键帧用来支持拖动播放
    [root@linuxidc video]# cd ../vod
      [root@linuxidc vod]# mv movie1.flv movie1-src.flv
      [root@linuxidc vod]# yamdi -i movie1-src.flv -o movie1.flv
      [root@linuxidc vod]# rm -rf movie1-src.flv

    接下来测试的话,下载 VLC Player 到本地测试(VLC 有时候会花屏,用 JWPlayer 就好了),或者不行麻烦的话装一个 apache 服务器并下载 JWPlayer 来测试。
    测试播放地址为(地址已失效,请勿访问):
    HTTP 形式访问:http://www.linuxidc.com/movie1.flv
      RTMP 形式访问:rtmp://www.linuxidc.com/vod/movie1.flv

    4.3)用 mencoder 转换 rmvb 文件
   
      4.4) 把 flv 转换成 hls 的 m3u8
      下载安装 segmenter
      [root@linuxidc ~]# yum install -y curl curl-devel zlib-devel openssl-devel perl perl-devel cpio expat-devel gettext-devel git
      [root@linuxidc ~]# git clone https://github.com/johnf/m3u8-segmenter.git
      [root@linuxidc ~]# cd m3u8-segmenter/
      [root@linuxidc m3u8-segmenter]# gcc -Wall -g m3u8-segmenter.c -o segmenter -lavformat
      [root@linuxidc m3u8-segmenter]# cp segmenter /usr/bin/
     
      转换成 ts,片源大小及清晰度等取决于 flv 文件,所以转成 flv 的时候一定要统一起来
    [root@linuxidc vod]# cd /mnt/media/vod
      [root@linuxidc vod]# mkdir /mnt/media/app/movie1/
      [root@linuxidc vod]# ffmpeg -y -i movie1.flv -f mpegts -c:v copy -c:a copy -vbsf h264_mp4toannexb /mnt/media/app/movie1/main.ts
     
      切片
    [root@linuxidc movie1]# cd /mnt/media/app/movie1/
      [root@linuxidc movie1]# segmenter -i main.ts -d 10 -p movie1 -m movie1.m3u8 -u http://www.linuxidc.com/hls/movie1/
      -d 10:每个切片为 10 秒,-p movie1:切片的名字的前缀
    -u URL 地址:m3u8 中播放列表的地址前缀,自己 cat 一下生成的 movie1.m3u8 就知道什么用 了
   

    测试一下,用 iPhone 的 Safari 访问一下 http://www.linuxidc.com/hls/movie1/movie1.m3u8

    注:安装日志记录于半年前的 evernote,现在才贴出来的,所以文中的视频访问地址都已经失效了。

更多 CentOS 相关信息见CentOS 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=14

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/121324.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计10617字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7979981
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的 3D 玩偶了 前些日子参加某网站活动,获得一次实物 3D 打印的机会,于是从众多...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...