如何在centos创建带ffmpeg库的nginx插件

前注:
我的用户是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)用浏览器访问:

如何在centos创建带ffmpeg库的nginx插件_第1张图片
333333.png

你可能感兴趣的:(如何在centos创建带ffmpeg库的nginx插件)