前注:
我的用户是root,可能某些命令包含root路径,应根据具体目录进行替换。
一、编译ffmpeg
对于我来说主要关注h264,aac,mp3。
1)准备好各种工具:
yum install autoconf automake bzip2 cmake freetype-develgcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel
2)在home目录下创建ffmpeg源码目录
mkdir ~/ffmpeg_sources
3)安装Yasm
cd~/ffmpeg_sources
git clone --depth1[git://github.com/yasm/yasm.git](git://github.com/yasm/yasm.git)
cdyasm
autoreconf-fiv
./configure --prefix="$HOME/ffmpeg_build"--bindir="$HOME/bin"
make
make install
4)安装libx264
cd~/ffmpeg_sources
git clone --depth1[git://git.videolan.org/x264](git://git.videolan.org/x264)
cdx264
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig"./configure --prefix="$HOME/ffmpeg_build"--bindir="$HOME/bin"--enable-static
make
make install
echo
5)安装libfdk_aac
cd~/ffmpeg_sources
git clone --depth1[git://git.code.sf.net/p/opencore](git://git.code.sf.net/p/opencore)-amr/fdk-aac
cdfdk-aac
autoreconf-fiv
./configure --prefix="$HOME/ffmpeg_build"--disable-shared
make
make install
echo
6)安装libmp3lame
cd~/ffmpeg_sources
curl-L-O[http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz](http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz)
tar xzvf lame-3.99.5.tar.gz
cdlame-3.99.5
./configure --prefix="$HOME/ffmpeg_build"--bindir="$HOME/bin"--disable-shared--enable-nasm
make
make install
echo
7)安装ffmpeg
cd~/ffmpeg_sources
curl-O[http://ffmpeg.org/releases/ffmpeg](http://ffmpeg.org/releases/ffmpeg)-snapshot.tar.bz2
tar xjvf ffmpeg-snapshot.tar.bz2
cdffmpeg
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig"./configure --prefix="$HOME/ffmpeg_build"--extra-cflags="-I$HOME/ffmpeg_build/include"--extra-ldflags="-L$HOME/ffmpeg_build/lib -ldl"--bindir="$HOME/bin"--pkg-config-flags="--static"--enable-gpl--enable-nonfree--enable-libfdk_aac --enable-libfreetype--enable-libmp3lame --enable-libx264
make
make install
通过prefix 参数,就把可执行文件生成了到ffmpeg_build目录下。
二、编译nginx
1)下载解压nginx
打开http://nginx.org/en/download.html
查看此链接的url是:http://nginx.org/download/nginx-1.11.10.tar.gz
cd ~
wget[http://nginx.org/download/nginx-1.11.10.tar.gz](http://nginx.org/download/nginx-1.11.10.tar.gz)tar xjvfnginx-1.11.10
cd nginx-1.11.10
mkdir mytest
cd mytest
2)在mytest目录下编写测试模块
主要是两个文件,一个ngx_http_test_module.c,还有一个config文件
config 文件主要是告诉nginx 的configure 如何来编译此模块。
config文件如下写法:
CORE_LIBS="$CORE_LIBS
-lavformat -lavcodec -lavutil -lswscale -lswresample -lz -ldl
-lfdk-aac -lfreetype -lmp3lame -lx264 -pthread -lm "
CORE_INCS="$CORE_INCS /root/ffmpeg_build/include"
ngx_addon_name=ngx_http_test_module
HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_test_module"
CFLAGS="$CFLAGS -ggdb -D_DEBUG -D_LARGEFILE_SOURCE"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_test_module.c"
ngx_http_test_module.c如下写法
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include
#include
#include
staticchar*set(ngx_conf_t *, ngx_command_t *, void*);
staticngx_int_t handler(ngx_http_request_t *);
staticngx_command_t test_commands[] = {
{
ngx_string("test"),
NGX_HTTP_LOC_CONF | NGX_CONF_NOARGS,
set,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL
},
ngx_null_command
};
staticngx_http_module_t test_ctx = {
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
};
ngx_module_t ngx_http_test_module = {
NGX_MODULE_V1,
&test_ctx,
test_commands,
NGX_HTTP_MODULE,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NGX_MODULE_V1_PADDING
};
staticchar*set(ngx_conf_t *cf, ngx_command_t *cmd, void*conf) {
ngx_http_core_loc_conf_t *corecf;
corecf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
corecf->handler = handler;
returnNGX_CONF_OK;
};
staticngx_int_t handler(ngx_http_request_t *req) {
u_char html[1024] = "
FFMPEG test
";
req->headers_out.status = 200;
intlen = sizeof(html) - 1;
req->headers_out.content_length_n = len;
ngx_str_set(&req->headers_out.content_type, "text/html");
ngx_http_send_header(req);
ngx_buf_t *b;
b = ngx_pcalloc(req->pool, sizeof(ngx_buf_t));
ngx_chain_tout;
out.buf = b;
out.next = NULL;
b->pos = html;
b->last = html + len;
b->memory = 1;
b->last_buf = 1;
av_register_all();
AVCodec* decoder = avcodec_find_decoder(AV_CODEC_ID_H264);
AVCodecContext * dc = avcodec_alloc_context3(decoder);
dc->bit_rate = 40000;
returnngx_http_output_filter(req, &out);
}
3)编译nginx
cd ~/nginx-1.11.10
./configure--prefix=/root/nginx_build--add-module=/root/nginx-1.11.10/mytest/ --with-ld-opt="-L /root/ffmpeg_build/lib"
make
make install
这里需要注意的是:ffmpeg 的头文件目录和lib文件名是在config文件里定义的,而ffmpeg的lib文件目录是在这里定义的。
4)修改入口
nginx.conf位于nginx_build/conf/nginx.conf
添加 /test入口
location / {
root html;
index index.html index.htm;
}
location /test {
test;
}
5)启动ngnix
cd ~/nginx_build/sbin
./nginx -c ~/nginx_build/conf/nginx.conf
6)用浏览器访问: