原文网址http://www.linuxidc.com/Linux/2015-08/121325.htm 不过有些信息由于网页问题看不到,不完整了,所以我copy过来完善下

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

最近因为项目关系,收朋友之托,想制作秀场网站,但是因为之前一直没有涉及到这方面的东西,没有什么感觉可言;搜索了一些资料以后,虽然有开业的实现方式,但是大家都没有完成的说明的,或者说我还没有更深入的研究到。不过让我找到了关于假设流媒体播放器的资料,不过是基于CentOS的操作(见 CentOS6下基于Nginx搭建mp4/flv流媒体服务器http://www.linuxidc.com/Linux/2015-08/121324.htm),那我就试做成ubuntu的step by step吧。

步骤如下:

step1准备ubuntu的环境:

sudo apt-get update

期间遇到了一些ubuntu的问题,总之就是倒腾ubuntu的依赖包。
一些指导:

sudo apt-get -f dist-upgrade
sudo apt-get update sudo apt-get install -f apt-cache depends linux-{image,headers}-generic apt-cache rdepend linux-image-3.16.0-41-generic:i386 do-release-upgrade 又提示 ubuntu boot空间不足 然后就是手动的mv 一个 文件到其他地方,腾出boot的空间,然后重新启动reboot,然后再次 apt-get update 就可以了

step2 安装必要的一些libs:

sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

sudo apt-get install gcc make automake bzip2 unzip patch subversion libjpeg62-dev

我使用的是root用户
cd ~
mkdir working
wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
tar zxvf yasm-1.2.0.tar.gz
cd yasm-1.2.0
./configure
make && make install
cd ~/working

step3 卸载系统原有的ffmgeg和x.264,没有则跳过:

apt-get remove ffmpeg x264
step4 先安装一些Mplayer编码库(仅限于64位系统):
wget -chttp://www2.mplayerhq.hu/MPlayer/releases/codecs/essential-amd64-20071007.tar.bz2

tar xvjf essential-amd64-20071007.tar.bz2
mkdir /usr/local/lib/codecs
cp -Rvp essential-amd64-20071007/* /usr/local/lib/codecs/
编辑下面文件
vim /etc/ld.so.conf
添加以下两行到上面的文件里
 /usr/lib 
 /usr/local/lib

step5 再安装一些格式转换常用的编码库:

amrnb opencore-amr amrwb libvorbis libtheora xvidcore


sudo apt-get install build-essential Git-core checkinstall texi2html libfaac-dev \
libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev \
libvorbis-dev libx11-dev libxfixes-dev zlib1g-dev libxvidcore-dev

setp6 安装x.264:

wget ftp://ftp.videolan.org/pub/videolan/x264/snapshots/last_stable_x264.tar.bz2

tar xvjf last_stable_x264.tar.bz2
cd x264-snapshot-20150803-2245-stable/
./configure --enable-shared --enable-pic
make && make install
cd ~/working

setp7 安装libvpx:

wget http://webm.googlecode.com/files/libvpx-v1.4.0.tar.bz2

wget https://github.com/webmproject/libvpx/releases/tag/v1.4.0

tar xvjf libvpx-v1.4.0.tar.bz2
cd libvpx-v1.4.0
./configure --enable-shared --enable-pic
make && make install
cd ~/working

step8 安装FFmpeg

wget http://ffmpeg.org/releases/ffmpeg-2.7.2.tar.bz2

tar xvjf ffmpeg-2.7.2.tar.bz2
cd ffmpeg-2.7.2
 ./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
 make && make install
 cd ~/working
 让动态链接库被系统共享
 ldconfig

step9 安装mplayer and mencoder

apt-get install libmp3lame-dev 
svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer (使用最新的代码可以编译安装,否则使用http://www.mplayerhq.hu/MPlayer/releases/mplayer-checkout-snapshot.tar.bz2 的话出错,)
cd mplayer/
./configure
make && make install

step 10 安装flvtool2:

sudo apt-get install ruby
gem -v
gem souce -l
https://rubygems.org/
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l
因为网络的原因,切换为淘宝的服务器
ll /usr/local/bin/flvtool2

step11 查看一下已经安装好的音频和视频编码器

查看所有所支持的音频编码

mencoder -oac help

查看所有所支持的视频编码
mencoder -ovc help

具体结果可参考

setp12 安装配置Nginx:

先安装各种依赖(Nginx需要pcre支持,yamdi用来为flv创建关键帧才能随意拖动)

sudo apt-get install gcc g++ libssl-dev zlib1g-dev libpcre3-dev yamdi

下载所需的Nginx模块

第一个是Nginx_mod_h264_streaming,让Nginx支持flv/mp4流播放

wget http://h264.code-shop.com/download/Nginx_mod_h264_streaming-2.2.7.tar.gz
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协议

wget -O Nginx-rtmp-module.zip https://github.com/arut/Nginx-rtmp-module/archive/master.zip
unzip Nginx-rtmp-module.zip

下载清缓存的模块

wget -O ngx_cache_purge.zip https://github.com/FRiCKLE/ngx_cache_purge/archive/master.zip
unzip ngx_cache_purge.zip

下载安装Nginx:

wget http://Nginx.org/download/Nginx-1.8.0.tar.gz
tar zxvf Nginx-1.8.0.tar.gz
cd Nginx-1.8.0
./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
make && make install

编译过程中出错:
make[1]: *** [objs/addon/src/mp4_reader.o] 错误 1

解决方法:
vim objs/Makefile (修改objs/Makefile文件,去掉其中的"-Werror"),然后就能够正常编译了.

step13 设置Nginx为系统服务

sudo wget https://raw.github.com/JasonGiedymin/Nginx-init-ubuntu/master/Nginx -O /etc/init.d/Nginx
sudo chmod +x /etc/init.d/Nginx
sudo update-rc.d Nginx defaults
sudo service Nginx start
sudo service Nginx stop

然后用浏览器你的服务器IP,看到welcome就对了
或者到Nginx的sbin目录下,运行一下Nginx -V,看看列表出来的modules对不对

step14 各种配置Nginx:
编辑/usr/local/Nginx/conf/Nginx.conf文件,最好用sftp软件(如windows下的flashfxp/Mac下的tramnsmit)下载过来本地编辑。

#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/video;
             mp4;
             limit_conn addr 20;
             limit_rate 200k;
        }

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

         access_log  logs/Nginxflv_access.log access;
    }
    
       
}

step14 把自己的电影转换成mp4和flv格式来测试Nginx搭的环境:

准备两部电影,硬盘上随便找,我找了“谍影重重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访问

用ffmpeg转换mp4文件(ffmpeg不支持rmvb)

cd /mnt/media/video/
ffmpeg -y -i movie1.mp4 -vcodec copy -acodec copy ../vod/movie1.flv
cd ../vod
mv movie1.flv movie1-src.flv
yamdi -i movie1-src.flv -o movie1.flv
rm -rf movie1-src.flv

step15 安装flv web播放器:

ckplayer播放器安装简单。就拿这个做实例吧。

cd /mnt
mkidr wwwroot

下载ckplayer6.7
解压,将所以文件上传到wwwroot下面

step16 制作页面播放流媒体:
cd /mnt/wwwroot
touch a.html
vi a.html
输入以下内容:

<div id="a1"></div>
<script type="text/javascript" src="/ckplayer/ckplayer.js" charset="utf-8"></script>
<script type="text/javascript"> var flashvars={ f:'http://你自己的ip地址/movie1.flv',c:0 }; var params={bgcolor:'#FFF',allowFullScreen:true,allowScriptAccess:'always',wmode:'transparent'}; var video=['http://你自己的ip地址/movie1.mp4->video/mp4']; CKobject.embed('/ckplayer/ckplayer.swf','a1','ckplayer_a1','100%',true,flashvars,video,params); </script>

具体配置的含义,可以参考再见配置工作,这里

step 17 结束:

欢迎各位批评指正! 如有问题,欢迎与我联系!

ubuntu14.04 下基于Nginx搭建mp4/flv流媒体服务器的更多相关文章

  1. Html5实现首页动态视频背景的示例代码

    这篇文章主要介绍了Html5实现首页动态视频背景的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. ios – MPMoviePlayerController不播放本地文件

    >file:///Users/utkal/Library/ApplicationSupport/iPhoneSimulator/7.0.3/Applications/F0B3AD63-7E46-4069-8845-8B0C05425CD2/CosMos.app/PTCL.mp4我得到第一个代码的videURL路径>file:///Users/utkal/Library/ApplicationSup

  3. 有没有办法在Android应用程序中播放.flv视频文件?

    是开箱即用还是通过图书馆?>htmlCode包含将视频显示为“全屏”的代码.>callHiddenWebViewMethod非常重要,否则视频将在活动不再可见时继续播放.这个问题归功于评论中链接的sliseshare海报.谢谢!要注意,事情不能按预期工作,或者可能在将来停止工作.顺便说一句,它对我来说非常好.

  4. 在Android中添加音频到视频

    我想开发一个可以录制视频的Android应用程序,然后我的资源文件夹中有一些音频文件,我想将其添加到视频的末尾.所以最终的效果就像是首先播放视频,在视频结束时,增加的音频将会被听到.我该怎么做?解决方法使用不同音频编解码器进行组合是不容易的.我会做以下事情:>将MP3文件转换为与视频相同的格式>现在,您可以使用mp4parser的AppendExample将录制的视频附加到预录音>结果将是一个包含视频第一个和声音的MP4文件.全面披露:我是mp4parser的维护者.

  5. Vue项目打包并部署nginx服务器的详细步骤

    vue项目开发好之后需要部署到服务器上进行外网访问,下面这篇文章主要给大家介绍了关于Vue项目打包并部署nginx服务器的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

  6. ubuntu中利用nginx部署vue项目的完整步骤

    Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行,下面这篇文章主要给大家介绍了关于ubuntu中利用nginx部署vue项目的相关资料,需要的朋友可以参考下

  7. 使用Node.js配合Nginx实现高负载网络

    这篇文章主要介绍了使用Node.js配合Nginx实现高负载网络,Node的异步加上Nginx的反向代理在性能上实在是给力!需要的朋友可以参考下

  8. CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)

    这篇文章主要介绍了CentOS 7.2 mini版本下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

  9. Symfony2在Nginx下的配置方法图文教程

    这篇文章主要介绍了Symfony2在Nginx下的配置方法,结合图文形式较为详细的分析了Symfony2在Nginx下的配置方法与具体操作步骤,需要的朋友可以参考下

  10. HTML5的Video标签有部分MP4无法播放的问题解析(多图)

    这篇文章主要介绍了HTML5的Video标签有部分MP4无法播放的问题。通过代码展示了设置的过程,具体操作步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部