服務器版本CentOS6.5
Tengine是由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性。Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。
下載地址 http://tengine.taobao.org/
1先添加幾個RPM下載源
1.1)安裝RPMforge的CentOS6源
[root@AY130611215205Z ~]# wget -c http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@AY130611215205Z ~]# rpm –import http://apt.sw.be/RPM-GPG-KEY.dag.txt
[root@AY130611215205Z ~]# rpm -i rpmforge-release-0.5.3-1.el6.rf.*.rpm
1.2)安裝epel源
[root@AY130611215205Z ~]# wget -c http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
[root@AY130611215205Z ~]# rpm -Uvf epel-release-6-8.noarch.rpm
安裝完成,查看一下源列表,看到rpmforge和epel字樣即可
[root@AY130611215205Z ~]# ls -lh /etc/yum.repos.d
2.安裝轉碼工具Mencoder及ffmpeg(約定:每個小點操作之前先回到用戶主目錄,即cd ~)
2.1)安裝一些基礎包,不用擔心重複,已經存在的會自動忽略或升級
[root@AY130611215205Z ~]# yum install gcc make automake bzip2 unzip patch subversion libjpeg-devel
[root@AY130611215205Z ~]# wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
[root@AY130611215205Z ~]# tar zxvf yasm-1.2.0.tar.gz
[root@AY130611215205Z ~]# cd yasm-1.2.0
[root@AY130611215205Z yasm-1.2.0]# ./configure
[root@AY130611215205Z yasm-1.2.0]# make && make install
[root@AY130611215205Z yasm-1.2.0]# cd ~
[root@AY130611215205Z ~]# yum remove ffmpeg x264
2.3)先安裝一些Mplayer編碼庫(僅限於64位系統)
[root@AY130611215205Z ~]# wget -c
http://www2.mplayerhq.hu/MPlayer/releases/codecs/essential-amd64-20071007.tar.bz2
[root@AY130611215205Z ~]# tar xvjf essential-amd64-20071007.tar.bz2
[root@AY130611215205Z ~]# mkdir /usr/local/lib/codecs
[root@AY130611215205Z ~]# cp -Rvp essential-amd64-20071007/* /usr/local/lib/codecs/
[root@AY130611215205Z ~]# vim /etc/ld.so.conf
添加以下兩行到上面的文件裏
/usr/lib
/usr/local/lib
2.4)再安裝一些格式轉換常用的編碼庫
[root@AY130611215205Z ~]# yum install faac-devel lame-devel amrnb-devel opencore-amr-devel amrwb-devel libvorbis-devel libtheora-devel xvidcore-devel ibfaac-dev
2.5)安裝x.264
[root@AY130611215205Z ~]# wget ftp://ftp.videolan.org/pub/videolan/x264/snapshots/last_stable_x264.tar.bz2
[root@AY130611215205Z ~]# tar xvjf last_stable_x264.tar.bz2
[root@AY130611215205Z ~]# cd x264-snapshot-20140219-2245-stable/ (這可能日期有區別,自己ls一下)
[root@AY130611215205Z x264-snapshot-20140219-2245-stable]# ./configure --enable-shared --enable-pic
[root@AY130611215205Z x264-snapshot-20140219-2245-stable]# make && make install
[root@AY130611215205Z x264-snapshot-20140219-2245-stable]# cd ~
2.6)安裝libvpx
[root@AY130611215205Z ~]# wgethttp://webm.googlecode.com/files/libvpx-v1.2.0.tar.bz2
[root@AY130611215205Z ~]# tar xvjf libvpx-v1.2.0.tar.bz2
[root@AY130611215205Z ~]# cd libvpx-v1.2.0
[root@AY130611215205Z libvpx-v1.2.0]# ./configure --enable-shared --enable-pic
[root@AY130611215205Z libvpx-v1.2.0]# make && make install
[root@AY130611215205Z libvpx-v1.2.0]# cd ~
2.7)安裝FFmpeg
[root@AY130611215205Z ~]# wget http://ffmpeg.org/releases/ffmpeg-2.0.1.tar.bz2
[root@AY130611215205Z ~]# tar xvjf ffmpeg-2.0.1.tar.bz2
[root@AY130611215205Z ~]# cd ffmpeg-2.0.1
[root@AY130611215205Z 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@AY130611215205Z ffmpeg-2.0.1]# make && make install
[root@AY130611215205Z ffmpeg-2.0.1]# cd ~
注:源碼安裝ffmpeg可能報錯ERROR: libfaac not found缺少faac解碼,說明ibfaac-dev安裝失敗
需要單獨下載安裝
libfaac
下載源碼包faac-1.28.tar.gz 並修改文件/faac-1.28/common/mp4v2/mpeg4ip.h
修改124-126行如下
124 extern "C++" {
125 #endif
126 const char *strcasestr(const char *haystack, const char *needle);
再編譯安裝./configure --enable-shared
make && make install
讓動態鏈接庫被系統共享
[root@AY130611215205Z ~]# ldconfig
2.8)最後安裝mencoder
[root@AY130611215205Z ~]# yum install mplayer mencoder flvtool2
查看一下已經安裝好的音頻和視頻編碼器
查看所有所支持的音頻編碼
[root@AY130611215205Z ~]# mencoder -oac help
查看所有所支持的視頻編碼
[root@AY130611215205Z ~]# mencoder -ovc help
具體結果可參考http://www.mplayerhq.hu/DOCS/HTML/zh_CN/menc-feat-selecting-codec.html
3.安裝配置Tengine(Nginx)
3.1)先安裝各種依賴(nginx需要pcre支持,yamdi用來爲flv創建關鍵幀才能隨意拖動)
[root@AY130611215205Z 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流播放
注: ngnix在現在的穩定版本1.8.0以上版本已經提供了對MP4的支持模塊ngx_http_mp4_module ,在配置時可以使用。這個模塊默認是不安裝的 編譯安裝時附加配置 --with-http_mp4_module開啓。
第二個是nginx-rtmp-module,讓nginx支持rtmp/hls協議
[root@AY130611215205Z ~]# wget -O nginx-rtmp-module.zip https://github.com/arut/nginx-rtmp-module/archive/master.zip
[root@AY130611215205Z ~]# unzip nginx-rtmp-module.zip
下載清緩存的模塊
[root@AY130611215205Z ~]# wget -O ngx_cache_purge.zip https://github.com/FRiCKLE/ngx_cache_purge/archive/master.zip
[root@AY130611215205Z ~]# unzip ngx_cache_purge.zip
3.3)安裝tengine(nginx)
tar zxvf tengine-2.1.2.tar.gz
cd tengine-2.1.2
./configure --user=daemon --group=daemon --prefix=/usr/local/tengine2 --add-module=../nginx-rtmp-module-master --add-module=../ngx_cache_purge-master --with-http_mp4_module --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
/**———以下是安裝了Tengine後重新編譯的代碼,模塊的路徑自己對一下———**//
./configure –user=www –group=www –prefix=/usr/local/tengine/ –add-module=../../../nginx-rtmp-module-master –add-module=../../../ngx_cache_purge-master --with-http_mp4_module –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@AY130611215205Z ~]# /usr/local/tengine/sbin/nginx
然後用瀏覽器你的服務器IP,看到welcome就對了
或者到nginx的sbin目錄下,運行一下nginx -V,看看列表出來的modules對不對
3.4)各種配置nginx
編輯/usr/local/tengine/conf/nginx.conf文件.
貼一下配置文件
———————————————————————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;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
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)準備部電影,硬盤上隨便找,
把電影重命名爲 movie1.mp4並上傳到服務器/opt/media/video下面,這裏目錄用來存放我們的原始視頻。還有一個目錄是/opt/media/vod 用來存放轉換後的視頻。
我這裏的具體目錄結構爲:
/opt/media/video -> 存放原始視頻
/opt/media/app -> 存放轉成m3u8的視頻,供http訪問(HLS)
/opt/media/vod -> 存放轉換後的flv和mp4視頻,供http或rtmp訪問
4.2)用ffmpeg轉換mp4文件(ffmpeg不支持rmvb)
[root@AY130611215205Z ~]# cd /opt/media/video/
[root@AY130611215205Z 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@AY130611215205Z video]# cd ../vod
[root@AY130611215205Z vod]# mv movie1.flv movie1-src.flv
[root@AY130611215205Z vod]# yamdi -i movie1-src.flv -o movie1.flv
[root@AY130611215205Z vod]# rm -rf movie1-src.flv
4.3)用mencoder轉換rmvb文件
4.4)把flv轉換成hls的m3u8
下載安裝segmenter
yum install -y curl curl-devel zlib-devel openssl-devel perl perl-devel cpio expat-devel gettext-devel git
[root@AY130611215205Z ~]# git clone https://github.com/johnf/m3u8-segmenter.git
[root@AY130611215205Z ~]# cd m3u8-segmenter/
[root@AY130611215205Z m3u8-segmenter]# gcc -Wall -g m3u8-segmenter.c -o segmenter -lavformat
[root@AY130611215205Z m3u8-segmenter]# cp segmenter /usr/bin/
轉換成ts,片源大小及清晰度等取決於flv文件,所以轉成flv的時候一定要統一起來
[root@AY130611215205Z vod]# cd /mnt/media/vod
[root@AY130611215205Z vod]# mkdir /mnt/media/app/movie1/
[root@AY130611215205Z vod]# ffmpeg -y -i movie1.flv -f mpegts -c:v copy -c:a copy -vbsf h264_mp4toannexb /mnt/media/app/movie1/main.ts
切片
[root@AY130611215205Z movie1]# cd /mnt/media/app/movie1/
[root@AY130611215205Z movie1]# segmenter -i main.ts -d 10 -p movie1 -m movie1.m3u8 -u http://121.199.47.208/hls/movie1/
-d 10:每個切片爲10秒,-p movie1:切片的名字的前綴
-u URL地址:m3u8中播放列表的地址前綴,自己cat一下生成的movie1.m3u8就知道什麼用 了
測試一下,用iPhone的Safari訪問一下http://121.199.47.208/hls/movie1/movie1.m3u8