Nginx模块修改(ngx_http_flv_module)
文章目录
本文实现内容:增加flv模块参数,跳过片头内容。flv模块默认只有start一个参数,添加一个配置参数iskip来指定是否跳过片头。
如果你对nginx的模块开发还不了解,请移步Nginx模块开发入门张洋同学的博客介绍的很是详细,下面只简单引用我认为比较重要的部分,以便解释本次修改的过程。要修改nginx模块,了解模块的工作原理是必备的,结合下图可以看出模块的主要逻辑是在Handler中处理的。
于是我们直接找到flv模块(位于 源码根目录/src/http/modules/ngx_http_flv_module.c文件)的ngx_http_flv_handler,下面修改正式开始
一、添加自定义参数
找到已有参数start出现的位置
...
if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) {
start = ngx_atoof(value.data, value.len);
...
代码的意思为获取参数start的值,照葫芦画瓢我们可以添加自定义的参数,再次上方我们加入以下代码
if (ngx_http_arg(r, (u_char *) "iskip", 5, &value) == NGX_OK) {
iskip = ngx_atoof(value.data, value.len);
if (iskip== NGX_ERROR) {
iskip = 0;
}
}
凑巧的是我们加入的参数“iskip”也刚好是5个字符,所以这里ngx_http_arg的第三个参数也是5,如果参数的key的字符数为其他数字其自行更换。同时还要注意参数的顺序要一致。
二、添加跳过片头逻辑
先看代码
....
if (r->args.len) {
if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) {
start = ngx_atoof(value.data, value.len);
if (start == NGX_ERROR || start >= len) {
start = 0;
}
//看这里
if (start) {
len = sizeof(ngx_flv_header) - 1 + len - start;
i = 0;
}
}
}
....
....
//还有这里
if (i == 0) {
b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
if (b == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
b->pos = ngx_flv_header;
b->last = ngx_flv_header + sizeof(ngx_flv_header) - 1;
b->memory = 1;
out[0].buf = b;
out[0].next = &out[1];
}
...
通过以上代码可知只有start参数不为0时,即不从片头开始播放时,程序要先向客户端发送一段flv的header,所以我们不用考虑自己动手加header的情况了,直接修改文件读取起始位置和文件大小就可以了,所以就有了下面这段代码
...
if (start) {
len = sizeof(ngx_flv_header) - 1 + len - start;
i = 0;
}
if(iskip){
start=start+4000;//指定跳过的字节数
len=len-4000;
}
...
所有修改到此为止,这里是修改后的ngx_http_flv_module.c文件。
总结:此次修改flv模块可以实现简单flv文件加密,即先通过flv编辑软件在flv文件的头部加入一段自定内容,在通过nginx播放时,自动跳过自定义内容就可以解读正确的内容,而通过其他播放器直接解读flv文件是不能识别为正常的flv文件的。更加安全的扩展可以在不同位置加入自定义内容,并在解密时验证自定义内容,本文就不再做更多的描述,如果您对flv加密有更好的方法,欢迎讨论
文章作者 古道
上次更新 2012-08-31