本文共 8439 字,大约阅读时间需要 28 分钟。
环境说明
操作系统:Windows 7 Ultimate
FFmpeg 版本:ffmpeg20200809
Nginx 版本: 1.14.1
Nginx-Rtmp-Module 版本: 1.2.1
组件简介
nginx-rtmp-win32 下载:
FFmpeg 官网:
nginx 官网:
nginx-rtmp-module:
HLS:
西瓜播放器:
PotPlayer:
OBS:
rtmp 维基百科:
M3U 维基百科:
java + FFmpeg:
下载已添加好 rtmp 模块的 nginx :
修改配置后,启动 nginx
nginx.conf
worker_processes auto;events { worker_connections 1024;}# RTMP configurationrtmp { server { listen 1935; # Listen on standard RTMP port chunk_size 4000; application livetv { live on; # Turn on HLS hls on; hls_path C://m3u8//live; hls_fragment 3; hls_playlist_length 60; # disable consuming the stream from nginx as rtmp deny play all; } application file { live on; # Turn on HLS hls on; hls_path C://m3u8//show; hls_fragment 3; hls_playlist_length 60; # disable consuming the stream from nginx as rtmp deny play all; } }}http { sendfile off; tcp_nopush on; # aio on; directio 512; default_type application/octet-stream; server { listen 8080; location /live { # Disable cache add_header Cache-Control no-cache; # CORS setup add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Expose-Headers' 'Content-Length'; # allow CORS preflight requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root E://m3u8; } location /show { # Disable cache add_header Cache-Control no-cache; # CORS setup add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Expose-Headers' 'Content-Length'; # allow CORS preflight requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root E://m3u8; } }}
说明:请先创建文件夹 C://m3u8//live
和 C://m3u8//show
,文件夹可位置自行修改
配置文件中 分为 rtmp 段和 http 段
rtmp 段提供给 FFmpeg 进行推流,端口是 1935,地址分为 livetv
和 file
,视频缓存地址是 C://m3u8//live
和 C://m3u8//show
URL:rtmp://127.0.0.1:1935/livetv/[文件名]
和 rtmp://127.0.0.1:1935/file/[文件名]
http 段提供给播放器连接,端口是 8080,地址分为 live
和 show
,文件根目录指向 C://m3u8
URL:http://192.168.10.171:3004/live/[文件名].m3u8
和 http://192.168.10.171:3004/show/[文件名].m3u8
,其中 live 和 show 对应 rtmp 段的 live 文件夹和 show 文件夹
官网下载 FFmepg 最新版,解压
将 bin 目录配置到环境变量 path 中,方便执行命令(Windows 环境)
将 rtmp 服务推流到 nginx- rtmp
> ffmpeg -re -i rtmp://58.200.131.2:1935/livetv/hunantv -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv rtmp://127.0.0.1:1935/livetv/stream
> ffmpeg -re -i C://show.flv -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv rtmp://127.0.0.1:1935/file/stream
备注:视频缓存文件(.ts)会自动删除;如果需要保存,FFmpeg 支持录制功能
代码生成:
xgplayer
直播
PotPlayer 下载:
名称 | 服务网址 |
---|---|
湖南卫视 | rtmp://58.200.131.2:1935/livetv/hunantv |
CCTV1 高清 | http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 |
CCTV5 高清(体育) | http://ivi.bupt.edu.cn/hls/cctv5hd.m3u8 |
CCTV6 高清(电影) | http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8 |
使用 ANSI 编码
)@echo off:: 最小化窗口%1(start /min cmd.exe /c %0 :& exit ):: 设置标题title live_streaming_v2:: 启动推流服务ffmpeg -re -i "rtmp://58.200.131.2:1935/livetv/hunantv" -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv rtmp://127.0.0.1:1935/show/stream:: 自动关闭窗口exit
使用 ANSI 编码
)
window_title
值 与live_streaming_startup_v2.bat
里的title
值要一致
file_path
值为 nginx-rtmp 配置的文件路径
@echo off:: 最小化窗口:: %1(start /min cmd.exe /c %0 :& exit )::==========================================::======= 网络设置 =========================::==========================================:: ping 地址set ping_address=www.baidu.com:: 频率:1秒钟一次set test_frequency=30:: 启动的服务set service_name=live_streaming_startup_v2.bat:: 推流窗口标题set window_title=live_streaming_v2::==========================================::======= 文件设置 =========================::==========================================:: 文件路径set file_path=C:/m3u8//live:: 文件数阀值set m3u8_file_threshold=1set ts_file_threshold=5::【网络检测】:checkping -n 2 %ping_address%:: 网络连接失败,循环检测IF ERRORLEVEL 1 goto check:: 网络连接成功,开始检查文件IF ERRORLEVEL 0 goto checkFilepause > nul:: 【检查文件】:checkFileecho file checking...:: 检测前,初始化文件数set m3u8_index=0set ts_index=0:: 循环指定后缀的文件for %%i in (%file_path%\*.m3u8) do ( :: 输出全路径 :: echo %%i set /a m3u8_index=m3u8_index+1):: 循环指定后缀的文件for %%i in (%file_path%\*.ts) do ( :: 输出全路径 :: echo %%i set /a ts_index=ts_index+1):: 判断 m3u8 是否到达阀值if %m3u8_index% lss %m3u8_file_threshold% ( :: echo %m3u8_file_threshold% echo camera live streaming startup [m3u8] ... :: 小于阀值,启动推流服务 :: 关闭之前的窗口 start taskkill /f /t /fi "imagename eq cmd.exe" /fi "windowtitle eq 管理员: %window_title%" :: 启动服务 start %service_name%) else ( echo The number of m3u8 is: %m3u8_index% :: :: 判断 ts 是否到达阀值 if %ts_index% lss %ts_file_threshold% ( :: echo %ts_file_threshold% echo camera live streaming startup [ts] ... :: 小于阀值,启动推流服务 :: 关闭之前的窗口 start taskkill /f /t /fi "imagename eq cmd.exe" /fi "windowtitle eq 管理员: %window_title%" :: 启动服务 start %service_name% ) else ( echo The number of ts is: %ts_index% ))goto continuousTestingpause > nul::【持续检测文件】:continuousTestingping -n %test_frequency% %ping_address%IF ERRORLEVEL 1 goto checkIF ERRORLEVEL 0 goto checkFilepause > nul
@echo off:: 测试连接的目标网站set ping_address=www.baidu.com:: 持续测试网络的次数,会影响日志输出频率set test_frequency=10:: 启动的服务set service_name=live_streaming_startup_v2.bat:: 日志文件set log_file_path=C:\check_network_log.txt:: 最小化窗口:: %1(start /min cmd.exe /c %0 :& exit )::【网络检测】:checkping -n 2 %ping_address%IF ERRORLEVEL 1 goto checkIF ERRORLEVEL 0 goto startUppause > nul::【网络正常,启动服务】:startUpecho camera live streaming startup...:: 启动推流服务start %service_name%:: 继续网络检测goto continuousTestingpause>nul::【持续检测网络,并输入日志】:continuousTestingping -n %test_frequency% %ping_address%IF ERRORLEVEL 1 (echo %date% %time% network anomaly >> %log_file_path%) && goto checkIF ERRORLEVEL 0 (echo %date% %time% network normal >> %log_file_path%) && goto continuousTestingpause>nul
ffmpeg -i rtmp://58.200.131.2:1935/livetv/hunantv -c copy -f segment -segment_time 600 -reset_timestamps 1 C:\output\hunantv_%08d.flv
OBS 官网:
注意输出的 FPS 数值,会影响画质和流畅度
ffmpeg -threads 2 -re -i "rtmp://58.200.131.2:1935/livetv/hunantv" -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -threads 1 -f flv rtmp://127.0.0.1:1935/show/stream
start 命令说明:
start /WAIT /affinity 0x1 ffmpeg -threads 2 -re -i "rtmp://58.200.131.2:1935/livetv/hunantv" -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -threads 1 -f flv rtmp://127.0.0.1:1935/show/stream
命令行 | 说明 |
---|---|
start /WAIT /affinity 0x1 ffmpeg | 只使用第一个CPU |
start /WAIT /affinity 0x2 ffmpeg | 只使用第二个CPU |
start /WAIT /affinity 0x4 ffmpeg | 只使用第三个CPU |
start /WAIT /affinity 0x8 ffmpeg | 只使用第四个CPU |
start /WAIT /affinity 0x3 ffmpeg | 只使用第1,2个CPU |
start /WAIT /affinity 0x7 ffmpeg | 只使用第1,2,3个CPU |
tart /WAIT /affinity 0xf ffmpeg | 只使用第1,2,3,4个CPU |
nginx-rtmp 的 nginx.conf 未测试成功的参数
pull:直接写入 rtmp rul
exec:直接执行 ffmpeg 命令
转载地址:http://oznws.baihongyu.com/