博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx-rtmp配合FFmpeg实现HLS服务
阅读量:4298 次
发布时间:2019-05-27

本文共 8439 字,大约阅读时间需要 28 分钟。

文章目录

Nginx-rtmp配合FFmpeg实现HLS服务

一、前言

  1. 环境说明

    操作系统:Windows 7 Ultimate

    FFmpeg 版本:ffmpeg20200809

    Nginx 版本: 1.14.1

    Nginx-Rtmp-Module 版本: 1.2.1

  2. 组件简介

  • nginx-rtmp: 指带有 rtmp 模块的 nginx
  • FFmpeg: 用于记录,转换和流传输音频和视频
  • rtmp 协议: RTMP(Real Time Messaging Protocol)实时消息传送协议是 Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议
  • HLS: Apple的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件
  • m3u8 文件格式: Unicode 版本的M3U,用 UTF-8 编码。"M3U"和"M3U8"文件都是苹果公司使用的 HTTP Live Streaming 格式的基础,这种格式可以在 iPhone 和 Macbook等设备播放
  • OBS: 免费且开源的用于视频录制以及直播串流的软件
  • PotPlayer: 多种格式的强大媒体播放器

nginx-rtmp-win32 下载:

FFmpeg 官网:

nginx 官网:

nginx-rtmp-module:

HLS:

西瓜播放器:

PotPlayer:

OBS:

rtmp 维基百科:

M3U 维基百科:

java + FFmpeg:

二、正文

场景说明

在这里插入图片描述

  • 从右到左,FFmpeg 将 rtmp 服务和本地文件推流到 nginx-rtmp 进行代理 ;将 rtmp 服务转换为 HLS 服务
  • 为什么转换?因为 rtmp 服务需要 Flash Player 才能播放,一般的浏览器已经不再支持 Flash,所以无法对 rtmp 的服务进行播放。而苹果公司的设备从很久之前就不支持 Flash 了,并提出了 HLS 服务进行中转

nginx-rtmp 配置

  • 下载已添加好 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//liveC://m3u8//show ,文件夹可位置自行修改

    1. 配置文件中 分为 rtmp 段和 http 段

    2. rtmp 段提供给 FFmpeg 进行推流,端口是 1935,地址分为 livetvfile ,视频缓存地址是 C://m3u8//liveC://m3u8//show

      URL:rtmp://127.0.0.1:1935/livetv/[文件名]rtmp://127.0.0.1:1935/file/[文件名]

    3. http 段提供给播放器连接,端口是 8080,地址分为 liveshow ,文件根目录指向 C://m3u8

      URL:http://192.168.10.171:3004/live/[文件名].m3u8http://192.168.10.171:3004/show/[文件名].m3u8 ,其中 live 和 show 对应 rtmp 段的 live 文件夹和 show 文件夹

FFmepg 推流

  • 官网下载 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
  • 将本地视频推流到 nginx- rtmp
> 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 支持录制功能

前端 web 播放器

  • 西瓜播放器

代码生成:

      
xgplayer
  • video.js
    
直播

三、其它

1.直播服务

  • 可通过 PotPlayer 播放器进行播放

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

2.检测网络状态脚本

  • 运行 FFmpeg 推流脚本( live_streaming_startup_v2.bat 使用 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
  • 检测网络并检测文件 ( check_network_v2.bat 使用 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
  • 【旧版】检测网络状态 ( check_network_v1.bat )
@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

4.分段录制

  • 将 rtmp 协议的直播流视频,按 600 秒一个视频分段输出
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

5.另一种本地视频推流

  • 使用 OBS 软件进行推流

OBS 官网:

6.CPU占用率过高

注意输出的 FPS 数值,会影响画质和流畅度

  • 解决方法一:ffmpeg 设置解码线程数和编码线程数
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
  • 解决方法二:Windows 操作系统控制

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
  • 对应 4 核CPU
命令行 说明
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

7.待解决问题

nginx-rtmp 的 nginx.conf 未测试成功的参数

  • pull:直接写入 rtmp rul

  • exec:直接执行 ffmpeg 命令

转载地址:http://oznws.baihongyu.com/

你可能感兴趣的文章
ios设备唯一标识获取策略
查看>>
获取推送通知的DeviceToken
查看>>
Could not find a storyboard named 'Main' in bundle NSBundle
查看>>
CocoaPods安装和使用教程
查看>>
Beginning Auto Layout Tutorial
查看>>
block使用小结、在arc中使用block、如何防止循环引用
查看>>
iPhone开发学习笔记002——Xib设计UITableViewCell然后动态加载
查看>>
iOS开发中遇到的问题整理 (一)
查看>>
Swift code into Object-C 出现 ***-swift have not found this file 的问题
查看>>
为什么你的App介绍写得像一坨翔?
查看>>
RTImageAssets插件--@3x可自动生成@2x图片
查看>>
iOS开发的一些奇巧淫技
查看>>
常浏览的博客和网站
查看>>
Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
查看>>
点击button实现Storyboard中TabBar Controller的tab切换
查看>>
Xcode 的正确打开方式——Debugging
查看>>
打包app出现的一个问题
查看>>
iOS在Xcode6中怎么创建OC category文件
查看>>
Expanding User-Defined Runtime Attributes in Xcode with Objective-C
查看>>
iOS7 UITabBar自定义选中图片显示为默认蓝色的Bug
查看>>