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

最近因为项目关系,收朋友之托,想制作秀场网站,但是因为之前一直没有涉及到这方面的东西,没有什么感觉可言;搜索了一些资料以后,虽然有开业的实现方式,但是大家都没有完成的说明的,或者说我还没有更深入的研究到。不过让我找到了关于假设流媒体播放器的资料,不过是基于centos的操作,那我就试做成ubuntu的step by step吧。

步骤如下:

step1准备ubuntu的环境:

sudo apt-get update

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

一些指导:

  1. sudo apt-get -f dist-upgrade
  2. sudo apt-get update
  3. sudo apt-get install -f
  4. apt-cache depends linux-{image,headers}-generic
  5. apt-cache rdepend linux-image-3.16.0-41-generic:i386
  6. do-release-upgrade 又提示 ubuntu boot空间不足
  7. 然后就是手动的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

  1. 我使用的是root用户
  2. cd ~
  3. mkdir working
  4. wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
  5. tar zxvf yasm-1.2.0.tar.gz
  6. cd yasm-1.2.0
  7. ./configure
  8. make && make install
  9. cd ~/working

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

apt-get remove ffmpeg x264

step4 先安装一些Mplayer编码库(仅限于64位系统):

wget -c http://www2.mplayerhq.hu/MPlayer/releases/codecs/essential-amd64-20071007.tar.bz2

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

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

sudo apt-get install 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

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

setp7 安装libvpx:

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

  1. tar xvjf libvpx-v1.4.0.tar.bz2
  2. cd libvpx-v1.4.0
  3. ./configure enable-shared enable-pic
  4. make && make install
  5. cd ~/working

step8 安装FFmpeg

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

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

step9 安装mplayer and mencoder

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

step 10 安装flvtool2

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

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

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

  1. 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流播放

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

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

下载清缓存的模块

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

下载安装nginx:

  1. wget http://nginx.org/download/nginx-1.8.0.tar.gz
  2. tar zxvf nginx-1.8.0.tar.gz
  3. cd nginx-1.8.0
  4. ./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
  5. make && make install

编译过程中出错:

make[1]: *** [objs/addon/src/mp4_reader.o] 错误 1

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

step13 设置nginx为系统服务

  1. sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
  2. sudo chmod +x /etc/init.d/nginx
  3. sudo update-rc.d nginx defaults
  4. sudo service nginx start
  5. sudo service nginx stop

然后用浏览器你的服务器IP,看到welcome就对了

或者到nginx的sbin目录下,运行一下nginx -V,看看列表出来的modules对不对

step14 各种配置nginx:

编辑/usr/local/nginx/conf/nginx.conf文件,最好用sftp软件(如windows下的flashfxp/Mac下的tramnsmit)下载过来本地编辑。

  1. #filename:nginx.conf
  2. #user nobody;
  3. worker_processes 1;
  4. error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #error_log logs/error.log info;
  7. pid logs/nginx.pid;
  8. events {
  9. use epoll;
  10. worker_connections 1024;
  11. }
  12. rtmp {
  13. server {
  14. listen 1935;
  15. chunk_size 4000;
  16. # video on demand
  17. application vod {
  18. play /mnt/media/vod;
  19. }
  20. # HLS
  21. # HLS requires libavformat & should be configured as a separate
  22. # NGINX module in addition to nginx-rtmp-module:
  23. # ./configure … –add-module=/path/to/nginx-rtmp-module/hls …
  24. # For HLS to work please create a directory in tmpfs (/tmp/app here)
  25. # for the fragments. The directory contents is served via HTTP (see
  26. # http{} section in config)
  27. #
  28. # Incoming stream must be in H264/AAC/MP3. For iPhones use baseline H264
  29. # profile (see ffmpeg example).
  30. # This example creates RTMP stream from movie ready for HLS:
  31. #
  32. # ffmpeg -loglevel verbose -re -i movie.avi -vcodec libx264
  33. # -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
  34. # -f flv rtmp://localhost:1935/hls/movie
  35. #
  36. # If you need to transcode live stream use ‘exec’ feature.
  37. #
  38. application hls {
  39. hls on;
  40. hls_path /mnt/media/app;
  41. hls_fragment 10s;
  42. }
  43. }
  44. }
  45. http {
  46. include mime.types;
  47. default_type application/octet-stream;
  48. sendfile on;
  49. keepalive_timeout 65;
  50. gzip on;
  51. #log format
  52. log_format access $remote_addr $remote_user [$time_local] $request
  53. $status $body_bytes_sent $http_referer
  54. ‘”$http_user_agent $http_x_forwarded_for’;
  55. #定义一个名为addr的limit_zone,大小10M内存来存储session
  56. limit_conn_zone $binary_remote_addr zone=addr:10m;
  57. server {
  58. listen 8080;
  59. server_name localhost;
  60. # HTTP can be used for accessing RTMP stats
  61. # This URL provides RTMP statistics in XML
  62. location /stat {
  63. rtmp_stat all;
  64. rtmp_stat_stylesheet stat.xsl;
  65. }
  66. location /stat.xsl {
  67. root /mnt/soft/nginx-rtmp-module-master;
  68. }
  69. location /control {
  70. rtmp_control all;
  71. }
  72. location / {
  73. root /mnt/soft/nginx-rtmp-module-master/test/rtmp-publisher;
  74. }
  75. }
  76. server {
  77. listen 80;
  78. server_name localhost;
  79. location / {
  80. root /mnt/wwwroot;
  81. index index.html;
  82. }
  83. location ~ \.flv$ {
  84. root /mnt/media/vod;
  85. flv;
  86. limit_conn addr 20;
  87. limit_rate 200k;
  88. }
  89. location ~ \.mp4$ {
  90. root /mnt/media/video;
  91. mp4;
  92. limit_conn addr 20;
  93. limit_rate 200k;
  94. }
  95. location /hls {
  96. # Serve HLS fragments
  97. alias /mnt/media/app;
  98. }
  99. access_log logs/nginxflv_access.log access;
  100. }
  101. }

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

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

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

  1. cd /mnt/media/video/
  2. ffmpeg -y -i movie1.mp4 -vcodec copy -acodec copy ../vod/movie1.flv
  3. cd ../vod
  4. mv movie1.flv movie1-src.flv
  5. yamdi -i movie1-src.flv -o movie1.flv
  6. rm -rf movie1-src.flv

step15 安装flv web播放器:

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

  1. cd /mnt
  2. mkidr wwwroot

下载 ckplayer6.7

解压,将所以文件上传到wwwroot下面

step16 制作页面播放流媒体:

cd /mnt/wwwroot

touch a.html

vi a.html

输入以下内容:

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

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

step 17 结束:

欢迎各位批评指正!

如有问题,欢迎与我联系!

参考页面:

  1. https://www.vultr.com/docs/setup-nginx-rtmp-on-ubuntu-14-04
  2. https://www.vimp.com/en/web/faq-installation/items/how-to-install-the-transcoding-tools-on-ubuntu-1404.html
  3. http://hdu104.com/294
  4. baidu.com
  5. google.com
  6. 等等.

Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)的更多相关文章

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

    1.先添加几个RPM下载源 1.1)安装RPMforge的CentOS6源     [root@AY130611215205Z ~]# wget -c http://pkgs.repoforge.or ...

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

    CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 1.先添加几个RPM下载源 1.1)安装RPMforge的CentOS6源 [roo ...

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

    我的步骤如下:1. 安装依赖包: yum install glibc.i686#yum –y update#yum -y install gcc glibc glibc-devel make nasm ...

  4. Ubuntu 14.10 下安装Ganglia监控集群

    关于 Ganglia 软件,Ganglia是一个跨平台可扩展的,高性能计算系统下的分布式监控系统,如集群和网格.它是基于分层设计,它使用广泛的技术,如XML数据代表,便携数据传输,RRDtool用于数 ...

  5. Ubuntu 14.10 下ZooKeeper+Hadoop2.6.0+HBase1.0.0 的HA机群高可用配置

    1 硬件环境 Ubuntu 14.10 64位 2 软件环境 openjdk-7-jdk hadoop 2.6.0 zookeeper-3.4.6 hbase-1.0.0 3 机群规划 3.1 zoo ...

  6. Ubuntu 14.10 下安装java反编译工具 jd-gui

    系统环境,Ubuntu 14.10 ,64位 1 下载JD-GUI,网址http://221.3.153.126/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/jd.benow.ca/ ...

  7. windows环境下基于nginx搭建rtmp服务器

    基于nginx搭建rtmp服务器需要引入rtmp模块,引入之后需重新编译nginx linux环境几个命令行就能实现编译,笔者未尝试,网上有很多教程. windows环境还需要安装一系列的编译环境,例 ...

  8. Ubuntu 14.10 下Hive配置

    1 系统环境 Ubuntu 14.10 JDK-7 Hadoop 2.6.0 2 安装步骤 2.1 下载Hive 我第一次安装的时候,下载的是Hive-1.2.1,配置好之后,总是报错 [ERROR] ...

  9. Ubuntu 14.10 下DokuWiki安装

    环境说明: Ubuntu 14.10 64位 1 下载DokuWiki:http://download.dokuwiki.org/ 2 解压到 /var/www/html下面 3 如果没有安装Apac ...

随机推荐

  1. 如何在Cocos2D 1.0 中掩饰一个精灵(四)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 为了完成需要的效果,我们将使用如下策略: 我们将首先绘制掩饰精灵 ...

  2. OJ题:将一个数倒置输出

    题目描述: 输入一个数,假如num = 12345 , 输出 54321,以此类推. 代码实现: ) ; }

  3. 15-5-23 下午02时22分58秒 CST> <Info> <Management> <BEA-141281> <unable to get file lock, will retry ...>

     A-141281> <unable to get file lock, will retry ...>   http://gdutlzh.blog.163.com/blog/s ...

  4. 方便使用FFMPEG的经验

    FFMPEG是命令行工具,因此使用起来多少还是会有些不方便.在这记录两点方便使用FFMPEG的方法: 1.任何目录下都可以使用FFMPEG 问题描述:需要转码(播放)的时候,需要把ffmpeg.exe ...

  5. iOS 使用AVAudioPlayer开发录音功能

    最近要做一个类似对讲的功能,所以需要用到录音上传,然后再播放的功能. 一.音频格式分析 因为之前没研究过音频这块,所以很多音频格式都是第一次见. AAC: AAC其实是"高级音频编码(adv ...

  6. java组播MulticastSocket

    在单播模式中有服务器端和客户端之分,而组播模式与单播模式不同,每个端都是以路由器或交换机做为中转广播站,任意一端向路由器或交换机发送消息,路由或交换机负责发送其他节点,每个节点都是同等的.所以在编程模 ...

  7. PHP中关于foreach的简单的用法总结

    在php中使用循环方式输出数组里面的内容有好多种方式,我们既可以采用数组迭代循环的方式,当然也可以采用下面的foreach方法,日常开发中用到的最多就是它.下面我们就先看一下它的用法吧: //语法是: ...

  8. 【一天一道LeetCode】#21. Merge Two Sorted Lists

    一天一道LeetCode系列 (一)题目 Merge two sorted linked lists and return it as a new list. The new list should ...

  9. Google性能工程师Ilya Grigorik谈HTTP/2

    via:http://www.infoq.com/cn/news/2014/11/http2-develop HTTP/2,也就是超文本传输协议第2版,是下一代HTTP协议.该版本是自1999年HTM ...

  10. STL常用遍历算法for_each和transform的比较

    for_each()和transform()算法比较 1)STL 算法 – 修改性算法  for_each()  copy()  copy_backward()  transform()  merge ...