win下搭建ffmpeg+rtmp服务器

By | 2019-12-28

1.环境
开发环境:windows
开发工具:ffmpeg、nginx、nginx-rmtp-module、vlc media player播放器

2.准备文件
官方ffmpeg下载地址:http://www.ffmpeg.org

官方nginx下载地址:http://nginx.org
**这里说明一下Nginx原生为Linux服务的,官方并没有提供编译好的Windows版本下载,所以要在Windows下使用Nginx,要么下载源码自己编译,要么使用别人已经编译好的文件。
官方下载的会出现unknown directive “rtmp”模块缺少提示,所以这里打开链接http://nginx-win.ecsds.eu/download/,下载nginx 1.7.11.3 Gryphon.zip

服务器状态检查程序nginx-rtmp-module下载地址:https://github.com/arut/nginx-rtmp-module

官方vlc media player下载地址:https://www.videolan.org/vlc

3.安装nginx和ffmpeg
在c盘根目录下创建两个目录,ffmpeg和nginx目录
把下载好的ffmpeg文件复制到c:\ffmpeg目录下
把下载好的nginx文件复制到c:\nginx目录下
把下载好的nginx文件复制到c:\nginx\nginx-rtmp-module目录下

4.配置FFmpeg
环境配置:右键我的电脑 》属性 》高级系统设置 》高级 》环境变量 》双击Path ,将 c:\ffmpeg添加到Path路径下

5.配置nginx文件

文件目录C:\nginx\conf\nginx.conf

内容如下:

worker_processes  1;


error_log  logs/error.log debug;


events {
    worker_connections  1024;
}

#设定rtmp服务,实现推流,默认监听1935端口,路径关键字为hls
rtmp {
    server {
        listen 1935;


        application hls {
             live on;  #启用rtmp直播
                       #地址为rtmp://[server]:[rtmp_port]/[app]/[stream]
             hls on;   #启用hls直播
                       #地址为http://[server]:[http_port]/[app]/[stream].m3u8
                       #需要配合下面http段设置使用
             hls_path nginx-rtmp-module/tmp/app/;
             hls_fragment 5s;
             recorder rec {  #启用录制
               record all manual;  #手动控制录制启停
               record_suffix _rec.flv;
               record_path nginx-rtmp-module/tmp/rec/;  #录制保存地址
               record_unique on;
           }
       }
       application vod2{  #rtmp点播
        play nginx-rtmp-module/tmp/rec/;    
       }
    }
}

#Nginx服务器地址,监听端口,默认地址
http {
    server {
        listen      18080;


        location /stat {  #服务器状态
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }


        location /stat.xsl {
            root nginx-rtmp-module/;
        }


        location /control { #控制器
            rtmp_control all;
        }
        
location /hls/ {  #hls直播地址
           #server hls fragments
           types{
             application/vnd.apple.mpegurl m3u8;
             video/mp2t ts;
           }
           alias nginx-rtmp-module/tmp/app/;
           expires -1;
        }


        location /vod/{  #hls点播地址
            alias nginx-rtmp-module/tmp/rec/;
        }


        location / {
            root nginx-rtmp-module/test/www/;
        }
    }
}

也可以另存为另一个配置文件比如nginx-win-rtmp.conf

6.启动nginx

cmd进入nginx目录,输入下面语句启动服务

start nginx.exe -c conf\nginx-win-rtmp.conf

其中语句可以换成nginx.exe -c conf\nginx-win-rtmp.conf,只不过少了start,窗口会一直处于占用模式
其次如果需要停止nginx服务,可以输入下面的

nginx.exe -s stop -c conf\nginx-win-rtmp.conf
或者
nginx.exe -s quit -c conf\nginx-win-rtmp.conf

7.ffmpeg本地视频推流测试

ffmpeg 推流地址:rtmp://127.0.0.1:1935/hls/home

ffmpeg推流测试:ffmpeg.exe -re -i c:\ffmpeg\inputfile.mpg -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/hls/home

ffmpeg 拉流测试:ffplay.exe rtmp://localhost:1935/hls/home

使用vlc media player播放器测试输入网络URL:rtmp://127.0.0.1:1935/hls/home

8.推送rtmp流到nginx-rtmp

1. 推送rtmp流到nginx-rtmp
start ffmpeg\ffmpeg -re -i rtmp://live.hkstv.hk.lxdns.com/live/hks -vcodec libx264 -preset:v ultrafast 
-tune:v zerolatency -acodec copy -f flv rtmp://localhost:1935/hls/mystream -loglevel quiet
2. rtmp直播
ffmpeg\ffplay "rtmp://127.0.0.1:1935/hls/mystream"
3. hls 直播
ffmpeg\ffplay "http://127.0.0.1:18080/hls/mystream.m3u8"
4. 开始录制
http://127.0.0.1:18080/control/record/start?app=hls&name=mystream&rec=rec
5. 停止录制
http://127.0.0.1:18080/control/record/stop?app=hls&name=mystream&rec=rec
6. 为rtmp点播文件添加索引,否则文件在播放时进度条不能拖动,假定刚才录制的文件名为mystream-1428384476_rec.flv
yamdi\yamdi -i nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec.flv -o nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec_idx.flv
7. rtmp点播
ffmpeg\ffplay "rtmp://127.0.0.1:1935/vod2/mystream-1428384476_rec_idx.flv"
8. 制作hls点播分片文件
ffmpeg\ffmpeg -i E:\video-nginx\nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec.flv -acodec copy -bsf:a h264_mp4toannexb -g 105 -vcodec libx264 -vprofile baseline -bf 0 -bufsize 850k -bsf:v dump_extra -map 0 -f segment -segment_format mpegts -segment_list "E:\video-nginx\nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec\mystream-1428384476_rec.m3u8" -segment_time 10 E:\video-nginx\nginx_1.7.11.3_Gryphon\nginx-rtmp-module\tmp\rec\mystream-1428384476_rec\mystream-1428384476_rec-%d.ts
9. hls 点播
ffplay "http://127.0.0.1:8080/vod/mystream-1428384476_rec/mystream-1428384476_rec.m3u8"


推流方式:

摄像头推流
ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://127.0.0.1:1935/live/home
麦克风推流
ffmpeg -f dshow -i audio="麦克风 (2- USB2.0 MIC)" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://127.0.0.1:1935/live/123
摄像头&麦克风推流
ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -f dshow -i audio="麦克风 (2- USB2.0 MIC)" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://127.0.0.1:1935/live/123
或者
ffmpeg -f dshow -i video="USB2.0 PC CAMERA":audio="麦克风 (2- USB2.0 MIC)" -vcodec libx264 -r 25 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://127.0.0.1:1935/live/123
屏幕推流
首先需要安装一个软件,screen capture recorder
编译好的下载地址是:http://sourceforge.net
屏幕推流
ffmpeg -f gdigrab -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://127.0.0.1:1935/live/home
屏幕&麦克风推流
ffmpeg -f gdigrab -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://127.0.0.1:1935/rtmplive/home
屏幕&麦克风&摄像头
ffmpeg -f avfoundation -framerate 30 -i "1:0" \-f avfoundation -framerate 30 -video_size 640x480 -i "0" \-c:v libx264 -preset ultrafast \-filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/rtmplive/home

FFMPEG推流到RTMP服务器命令

1、将文件当作源推送到RTMP服务器
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName 
参数解释
-r 以本地帧频读数据,主要用于模拟捕获设备。表示ffmpeg将按照帧率发送数据,不会按照最高的效率发送
2、将直播文件保存至本地
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
3、将其中一个直播流中的视频改用H.264压缩,音频不变,推送到另外一个直播服务器
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream  
4、将其中一个直播流中的视频改用H.264压缩,音频改用aac压缩,推送到另外一个直播服务器
ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream 
5、将其中一个直播流中的视频不变,音频改用aac压缩,推送到另外一个直播服务器
ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream 
6、将一个高清流复制为几个不同清晰度的流重新发布,其中音频不变
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k  
7、将当前摄像头以及扬声器通过DSHOW采集,使用H.264/AAC压缩后推送到RTMP服务器
ffmpeg -r 25 -f dshow -s 640×480 -i video=”video source name”:audio=”audio source name” -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name
8、将一个JPG图片经过H.264压缩后输出为MP4文件
ffmpeg -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4  
9、将MP3转化为AAC
ffmpeg -i 20120814164324_205.wav -acodec  libfaac -ab 64k -ar 44100  output.aac  
10、将AAC文件转化为flv文件,编码格式采用AAC
ffmpeg -i output.aac -acodec libfaac -y -ab 32 -ar 44100 -qscale 10 -s 640*480 -r 15 output.flv

另外附上一个已经编译好的Nginx-rtmp-module Windows builds
https://github.com/illuspas/nginx-rtmp-win32

发表评论

电子邮件地址不会被公开。 必填项已用*标注