写这个文档时,我也刚接触FFmpeg一个周半的时间。是因为公司有个莫名其妙的需求,要使在内网的摄像头的实时视频能够在外网上让乙方软件用网页访问。需求描述就是如此的生动形象,苦笑。
因为从摄像头获取过来的视频流是rtsp协议的,通常是没有办法在网页上直接播放的,于是我就在网络上疯狂搜索能够在网页播放rtsp视频流的方法,打算将获取过来的视频流放在网页上,然后将网页放在外网上播放。也是做了好久的无用功,不过最后还是让我发现FFmpeg+Nginx+rtmp。
这个能做到什么将rtsp视频流转换成rtmp和hls,其实FFmpeg能做到的很多只要你足够了解他,唉!又是一句废话,要是足够了解你还看我干啥。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,能够解码、编码、转码、复用、解复用、流化、滤波和播放几乎任何人类和机器创造的多媒体文件。它具有高可移植性、高性能、高度安全、高度易用性、支持的格式多样性、高度可扩展等特点。
Nginx本身是一个非常出色的HTTP服务器,ffmpeg是非常好的音视频解决方案.这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器.这个流媒体服务器可以支持RTMP和HLS(Live
Http Stream)。nginx配合ffmpeg做流媒体服务器的原理是:
nginx通过rtmp模块提供rtmp服务, ffmpeg推送一个rtmp流到nginx, 然后客户端通过访问nginx来收看实时视频流.
HLS也是差不多的原理,只是最终客户端是通过HTTP协议来访问的,但是ffmpeg推送流仍然是rtmp的.
下载地址:https://ffmpeg.org/download.html
下图中的文件随便下载一个
解压后将名字改为ffmpeg
搜索 环境变量
环境变量—>Path—>新增 C:\ffmpeg\bin
到此就配置完成了。
cmd中运行:ffmpeg -version
如此ffmpeg就装好了,如果有问题可能是你文件下载的有问题。也可能你存放ffmpeg的位置和你环境变量里配置的不对应。
百度云:
链接:https://pan.baidu.com/s/1Al8rWC8FTpU_ko0c_cysRQ?pwd=6666
提取码:6666
我给的百度云里有我配置好的nginx-rtmp的文件,基本上可以直接用。如果你想多了解点就参考这位老哥的文章吧!https://www.pianshen.com/article/1225324732/
解压以后可以任意放到一个文件目录下,但是要记住目录地址后面会用到。
打开nginx\conf下nginx-win-rtmp.conf
如下代码:
rtmp {
server {
listen 4848;
chunk_size 4000;
application live {
live on;
}
}
}
listen:端口号
application live:app名为live(这个名字可以自定义,后面转换的)
将下一段代码添加到 application live 的下面
application hls {
live on;
hls on;
hls_path hls;
hls_fragment 5s;
}
#user nobody;
# multiple workers works !
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 8192;
# max value 32768, nginx recycling connections+registry optimization =
# this.value * 20 = max concurrent connections currently tested with one worker
# C1000K should be possible depending there is enough ram/cpu power
# multi_accept on;
}
rtmp {
server {
listen 4848;
chunk_size 4000;
application live {
live on;
}
application hls {
live on;
hls on;
hls_path hls;
hls_fragment 5s;
}
}
}
http {
#include /nginx/conf/naxsi_core.rules;
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr:$remote_port - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
# # loadbalancing PHP
# upstream myLoadBalancer {
# server 127.0.0.1:9001 weight=1 fail_timeout=5;
# server 127.0.0.1:9002 weight=1 fail_timeout=5;
# server 127.0.0.1:9003 weight=1 fail_timeout=5;
# server 127.0.0.1:9004 weight=1 fail_timeout=5;
# server 127.0.0.1:9005 weight=1 fail_timeout=5;
# server 127.0.0.1:9006 weight=1 fail_timeout=5;
# server 127.0.0.1:9007 weight=1 fail_timeout=5;
# server 127.0.0.1:9008 weight=1 fail_timeout=5;
# server 127.0.0.1:9009 weight=1 fail_timeout=5;
# server 127.0.0.1:9010 weight=1 fail_timeout=5;
# least_conn;
# }
sendfile off;
#tcp_nopush on;
server_names_hash_bucket_size 128;
## Start: Timeouts ##
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 30;
send_timeout 10;
keepalive_requests 10;
## End: Timeouts ##
#gzip on;
server {
listen 1515;
server_name localhost;
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root nginx-rtmp-module/;
}
location /control {
rtmp_control all;
}
location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias hls;
expires -1;
add_header Access-Control-Allow-Origin *;
}
#charset koi8-r;
#access_log logs/host.access.log main;
## Caching Static Files, put before first location
#location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
# expires 14d;
# add_header Vary Accept-Encoding;
#}
# For Naxsi remove the single # line for learn mode, or the ## lines for full WAF mode
location / {
#include /nginx/conf/mysite.rules; # see also http block naxsi include line
##SecRulesEnabled;
##DeniedUrl "/RequestDenied";
##CheckRule "$SQL >= 8" BLOCK;
##CheckRule "$RFI >= 8" BLOCK;
##CheckRule "$TRAVERSAL >= 4" BLOCK;
##CheckRule "$XSS >= 8" BLOCK;
root html;
index index.html index.htm;
}
# For Naxsi remove the ## lines for full WAF mode, redirect location block used by naxsi
##location /RequestDenied {
## return 412;
##}
## Lua examples !
# location /robots.txt {
# rewrite_by_lua '
# if ngx.var.http_host ~= "localhost" then
# return ngx.exec("/robots_disallow.txt");
# end
# ';
# }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000; # single backend process
# fastcgi_pass myLoadBalancer; # or multiple, see example above
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl spdy;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_prefer_server_ciphers On;
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!eNULL:!MD5:!DSS:!EXP:!ADH:!LOW:!MEDIUM;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
打开cmd命令提示符 打开nginx所在的位置,运行以下命令:
nginx.exe -c conf/nginx-win-rtmp.conf
测试
浏览器打开127.0.0.1:1515 端口号是在上文中设定的
1、新建cmd命令提示符窗口
2、ffmpeg转码
3、vlc测试
ffmpeg -i "rtsp://admin:[email protected]:554/h264/ch1/main/av_stream" -vcodec libx264 -acodec aac -f flv rtmp://192.168.100.170:4848/live/hls
使用ffmpeg命令推流,-i后面是摄像头流地址,-flv后面是推到nginx机器的地址,
vlc直接打开这个链接就可以看到转出来的视频画面。
ffmpeg -i "rtsp://admin:[email protected]:554/h264/ch1/main/av_stream" -vcodec libx264 -acodec aac -f flv rtmp://192.168.100.170:1515/hls/ test
使用ffmpeg命令推流,-i后面是摄像头流地址,-flv后面是推到nginx机器的地址,
vlc直接打开
rtmp://192.168.100.170:1515/hls/test.m3u8
就可以看到转出来的视频画面了。