标签 mp4 下的文章

利用Nginx的accesskey和secure_link模块实现防盗链

之前文章Nginx搭建flv mp4流媒体服务器中介绍了通过referer判断实现简单的防盗链,弊端是来源容易被伪造。今天介绍一下更高级的防盗链策略。

软件版本:
nginx-1.22.1
nginx-accesskey-2.0.3

增加编译参数 --with-http_secure_link_module --add-module=/root/nginx-accesskey-2.0.3 并重新编译 nginx

./configure --prefix=/usr/local/nginx --add-module=../nginx_mod_h264_streaming-2.2.7 --with-pcre=../pcre-8.41 --with-zlib=../zlib-1.2.11 --user=www --group=www --with-http_flv_module --with-http_stub_status_module --with-threads --with-http_ssl_module --with-http_secure_link_module --add-module=/root/nginx-accesskey-2.0.3 --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' --with-http_v2_module --with-http_mp4_module --with-cc-opt='-O3'
make && make install

完整的配置文件示例:

user www www;

worker_processes auto;

error_log  /usr/local/nginx/logs/error.log  crit;

pid /usr/local/nginx/logs/nginx.pid;

events {
    use epoll;
    worker_connections 65535;
}

http {
    include mime.types;
    default_type application/octet-stream;
    
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 150m;
    tcp_nopush on;
    tcp_nodelay on;
    
    sendfile on;
    
    keepalive_timeout 65;
    limit_conn_zone $binary_remote_addr zone=perip:10m; #容器共使用10M的内存来应对IP传输开销
    
    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    gzip_proxied        expired no-cache no-store private auth;
    gzip_disable        "MSIE [1-6]\.";
    
    server {
        listen 80;
        listen 443 ssl http2 fastopen=3 reuseport;
        server_name 2dan.cc; 
        root /home/html;
        limit_conn perip 3; #限制每个IP同一时间只能发起3个连接
        limit_rate_after 10m; #在视频文件下载10M以后开始限速
        limit_rate 100k; #速度限制为100K
        charset utf-8;
        
        ssl on;
        ssl_certificate      2dan.cc_bundle.crt;
        ssl_certificate_key  2dan.cc.key;
        ssl_session_timeout  5m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
        ssl_prefer_server_ciphers on;
        error_page 497 https://$host$uri; #http重定向到https 

        location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        }
        
        location ~ \.(mp4|m3u8)$ {
                 mp4;
                 valid_referers none blocked *.2dan.cc; #防盗链授权
            if ($invalid_referer) {
                  return 403;
            }
            if (!-e $request_filename) {rewrite ^/(.*)/(.*)/(.*)/(.*) /$4?key=$1&st=$2&e=$3 last;}
            accesskey on;
            accesskey_hashmethod md5;
            accesskey_arg "key";
            accesskey_signature "mypass$REMOTE_ADDR";
            secure_link $arg_st,$arg_e;
            secure_link_md5 mypass$arg_e;
            if ( $secure_link = "" ) {
                return 402;
            }
            if ( $secure_link = "0" ) {
                return 405;
            }
        }
        access_log off;
    }
}

结合PHP实现自动跳转到真实链接地址

- 阅读剩余部分 -

用ffmpeg把mp4切片为ts并生成m3u8列表

for %%a in (*.mp4) do ffmpeg.exe -i %%~na.mp4 -c:v libx264 -c:a aac -strict -2 -hls_time 120 -hls_list_size 0 -hls_allow_cache 1 -f hls %%~na.m3u8

-hls_time n 每段的时长,默认值为2 单位为秒
-hls_list_size n 播放列表保存的最多条目,设置为0会保存所有切片信息,默认值为5
-hls_allow_cache n 高速缓存开关,1为开启。

ffmpeg视频文件批量转换脚本

最近在制作mp4文件时,前后使用了魔影工厂、狸窝、格式工厂进行转码,但是发现转换过的视频经常有黑屏的现象,文件体积也比较大,自由度也比较低。最终发现了 ffmpeg 很好很强大,不但处理速度快,可自定义参数,处理过的视频体积小的很多,而且还很清晰。唯一美中不足的是这个软件的转换需要在命令行模式下完成。一个一个的复制、粘贴到cmd窗口,文件多了就吃不消了,这时人的惰性发挥了作用,于是就有了批量转换脚本,简单的一句话,几百个视频文件就哗啦哗啦的出来了。以 flv 到 mp4 文件为例:

for %%a in (*.flv) do ffmpeg.exe -threads 4 -i %%~na.flv -ab 32 -ar 22050 -vcodec libx264 -qscale 6 -r 25 -s 720x480 -flags +loop -crf 24 -bt 256k -vol 200 -keyint_min 6 -vf yadif %%~na.mp4

注意:文件名中如果有空格,需要加引号

常用参数:

-threads 指定用于编码的线程
-i 指定输入文件
-ab 设置音频码率
-ar 设置音频采样率
-vcodec 视频流编码方式
-qscale 使用固定的视频量化标度(VBR)
-r 视频流帧数(一般说来PAL制式通常用25,NTSC制式通常用29)
-s 视频分辨率
-flags 环路滤波器 (-loop禁用 +loop 启用)
-crf 恒定质量模式(也称为恒定ratefactor)
-bt 设置比特率容许的误差
-keyint_min 设置关键帧的间隔
-vol 设定音量
-vf 指定滤镜 (等同 -filter:v)

Nginx搭建flv mp4流媒体服务器

环境:Centos 8.0 64bit

一、安装依赖包

1.安装gcc-c++

yum -y install gcc-c++

2.安装zlib

wget http://zlib.net/zlib-1.2.11.tar.gz
tar xzvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make && make install

3.安装pcre

wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar zxvf pcre-8.43.tar.gz
cd pcre-8.43
./configure --prefix=/usr/local/pcre
make && make install

4.安装 openssl openssl-devel

yum install perl perl-devel
yum install openssl openssl-devel

5.下载mp4支持模块备用

wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
tar zxvf nginx_mod_h264_streaming-2.2.7.tar.gz
vi nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c

- 阅读剩余部分 -

将mp4视频元数据信息放在第一帧

需要软件:qt-faststart
解压得到qt-faststart.exe
放到 d:/mp4/ 目录下面
运行命令:

qt-faststart.exe d:/1.mp4 d:/2.mp4

最后出来的这个2.mp4就是成功的了。可以边下载边播放

附上一个批处理,实现将当前目录下所有的mp4文件自动处理

for %%a in (*.mp4) do qt-faststart.exe %%~na.mp4 %%~naz.mp4

处理过的视频后面统计增加一个字母z