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