漫谈 - FFmpeg 摄像头推流


1. 简介
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序

2. 摄像头推流
1) 前期准备
安装 ffmpeg + nsginx

sudo apt-get install ffmpeg //简单粗暴


查看nginx是否包含rtmp模块

$./nginx -V
nginx version: openresty/1.17.8.1
built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 
built with OpenSSL 1.0.2g 1 Mar 2016
TLS SNI support enabled
configure arguments: --prefix=../nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.1 --add-module=../echo-nginx-module-0.62 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.32 --add-module=../ngx_lua-0.10.17 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.15 --add-module=../rds-csv-nginx-module-0.09 --add-module=../ngx_stream_lua-0.0.8 --with-ld-opt=-Wl,-rpath,/opt/fy/3rd/openresty/luajit/lib --add-module=/opt/fy/3rd/nginx-rtmp-module-master --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_ssl_module

 

如果没有rtmp模块

$wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
$unzip master.zip

$cd ~/openresty-1.17.8.1 //进入到nginx之前安装的目录
#添加模块,--add-module=下载的模块路径
$./configure --prefix=~/openresty/ --add-module=/home/user/nginx-rtmp-module-master
$ make 

make执行完毕就可以了。无需make install ,否则会覆盖安装

会在相应../openresty-1.17.8.1/build/nginx-1.17.8/objs(安装包目录)目录下生产二进制文件nginx,将它替代运行中openresty的sbin/nginx文件
将生成的新nginx文件复制到你的安装目录

$sudo cp /opt/fy/3rd/openresty-1.17.8.1/build/nginx-1.17.8/objs/nginx  ../nginx/sbin/
$./nginx -V #查看rtmp模块是否成功增加


我们需要通过web端访问这个rtmp,即进行一个协议转需要在nginx里面进行配置

 #在nginx的http中新增一个server
  server {
        listen 10089;
        server_name  localhost;
        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            alias /opt/app/video/;
            expires -1;
            add_header Access-Control-Allow-Origin *;
        }
  }
#在和http同级中新增
rtmp {  
    server {  
        listen 11935;  
     
       application hls {  
         live on;  
         hls on;  
         hls_path /opt/app/video/;  #m3u8文件储存地址
         hls_fragment 1s;
         hls_playlist_length 3s;  
       }  
    } 
}

 

 

2)摄像头的rtsp地址格式
以海康威视为例

rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream


说明:
username: 用户名。例如admin。
password: 密码。例如12345。
ip: 为设备IP。例如 192.0.0.64。
port: 端口号默认为554,若为默认可不填写。
codec:有h264、MPEG-4、mpeg4这几种。
channel: 通道号,起始为1。例如通道1,则为ch1。
subtype: 码流类型,主码流为main,辅码流为sub。

服务器进行推流
完成以上准备工作
终端执行

ffmpeg -i "rtsp://admin:12345@192.168.1.1:554/h264/ch1/sub/av_stream" -f flv -vcodec libx264 -acodec aac -r 50 -g 5 -b:v 300k -s 672*378 -q 8 "rtmp://127.0.0.1:11935/hls/steam"

相关参数解释

-i "rtsp://admin:12345@192.168.1.1:554/h264/ch1/sub/av_stream" //输入您要处理的视频文件路径
-f flv //强迫采用格式flv
-vcodec libx264 //视频 强制使用libx264编解码方式 
-acodec aac //音频 使用aac编解码
-r 50 //要强制输出文件的帧频为24 fps 
-g 5 //设置图像组大小
-b:v 300k //要将输出文件的视频比特率设置为300 kbit / s
-s 672*378 //图像显示分辨率
-q 8 //以<数值>质量为基础的VBR,取值0.01-255,约小质量越好
"rtmp://127.0.0.1:11935/hls/steam" //推送至本地nginx设置的地址

3. 查看视频
可使用工具VLC查看。或配合前端文件展示

posted @ 2021-01-09 14:45  黑曼巴后仰  阅读(923)  评论(0编辑  收藏  举报