漫谈 - 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查看。或配合前端文件展示