Nginx+ffmpeg实现Hls(m3u8)推流播放,不使用flash

任务需求:由于各个浏览器已经终止了适配Flash播放插件,故此监控视频从之前的Rtmp格式变为Hls(m3u8)格式

相关环境:

  • 海康威视:
    网页配置监控视频端口:80(可修改),需账号密码
    流媒体传输监控视频端口:554(可修改)

  • 部署环境:
    系统版本:CentOS7.5
    Nginx版本:1.19.2
    ffmpeg版本:2.2
    IP:192.168.31.88
    原参考链接


一、Nginx部署:

主要安装参考链接
1、编译安装nginx

# yum -y install pcre-devel openssl openssl-devel        //安装依赖
# wget http://nginx.org/download/nginx-1.16.0.tar.gz        //下载nginx包
# tar xf nginx-1.16.0.tar.gz && cd nginx-1.16.0
# ./configure --prefix=/application/nginx  --with-http_ssl_module    //编译安装nginx
# make && make install

2、修改nginx配置文件,添加如下内容并重新载入配置文件

# vim /application/nginx/conf/nginx.conf
user  root;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       20000;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    location /hls {
    types{
    application/vnd.apple.mpegurl m3u8;
    video/mp2t ts;
    }
    root html;
    add_header Cache-Control no-cache;
    add_header Access-Control-Allow-Origin *;
     }
}
}
# /application/nginx/sbin/nginx -s reload //重新加载启动

二、ffmepg部署

ffmpeg命令参考这个文章

1、安装依赖
# yum install yasm -y
2、下载ffmpeg并安装
# git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg 
# cd ffmpeg		//解压并进入目录
# ./configure --prefix=/usr/local/ffmpeg
# make
# make install
3、拷贝命令到/usr/bin		//方便后面调用
# ls /usr/local/ffmpeg/        //查看安装目录生成的文件
bin  include  lib  nohup.out  share
# cp /usr/local/ffmpeg/bin/* /usr/bin/	//复制命令

三、配置ffmpeg转发

1、启用ffmpeg进行推流
# ffmpeg -re -rtsp_transport tcp -i rtsp://账号:密码@IP:端口/mpeg4/ch1/sub/av_stream.mp4 -acodec aac -strict experimental -ar 44100 -ac 2 -b:a 96k -r 25 -b:v 500k -s 480*480 -c `copy` -f hls -hls_time 2.0 -hls_list_size 0 -hls_wrap 15 /application/nginx/html/hls/test.m3u8

-i  //要处理视频文件的路径,此处地址是一个监控摄像头
-acodec //音频处理的格式
-strict experimental 	//更标准的严格性
-ar //设置音频采样率
-ac //设置通道为2
-b:a //要将输出文件的音频比特率设置为96 kbit/s
-r //要强制输出文件的帧频为24 fps
-b:v //要将输出文件的视频比特率设置为500 kbit/s。
-s //分辨率,传输的带宽根据分辨率来设定的,-b:v不能控制
-f //强制输出的视频格式
-hls_time  //为切片的秒数
-hls_list_size //设置播放列表保存的最多条目,我这里设置为0会保存有所片信息,默认值为5
-hls_wrap //为切片的个数

Tips:-s参数在ffmpeg转发命令里面就算使用了-c copy参数也不会生效!具体的分辨率是根据海康威视监控视频的分辨率来定的(主码流和子码流不相同)。主码流一般为1920x1080P[平均2M网速],子码流一般为1280x720P[平均1.2M网速],704x576[平均800Kb]。海康威视平台配置如下图,设置码率类型为定码率的话流量要稳定一些。
码流图


四、写前端访问代码查看:

<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="shortcut icon" href="./static/logo.ico">
  <style type="text/css">
    html,body{margin:0px;height:100%;width:100%; display: flex; align-items: center}
    #video{
         width:1000px;
        height:600px;
    }
  </style>
  <title>BUG</title>
  

</head>
<body style="margin:0;overflow:hidden">
     <video id="video" muted></video>
      <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  <script>
      function initVideo () {
          let video = document.getElementById('video')
          if(Hls.isSupported()) {
            let hls = new Hls()
            //该hls地址为nginx配置中的地址
            hls.loadSource('http://192.168.31.88:20000/hls/test.m3u8')
            hls.attachMedia(video)
            hls.on(Hls.Events.MANIFEST_PARSED,()=>{
                video.play()
            });
        }else if (video.canPlayType('application/vnd.apple.mpegurl')) {
          video.src = 'http://192.168.31.88:20000/hls/test.m3u8'
          video.addEventListener('loadedmetadata',function() {
                video.play()
            })
        }
      }
      initVideo()
      
  </script>
</body>

</html>
  • 可以在pc机浏览器上查看视频
  • 后续出现跨域问题配置Nginx端口访问index.html即可

五、报错相关:

1、如果到启动时缺少了ffmpeg模块

参考链接
解决办法:
1、去其他服务器上有这个模块的拷贝过来libva.so.1 、libva-drm.so.1
2、去下载这个模块放在对应的位置
# ldd `which ffmpeg` //查看缺少的模块


六、写在最后:

1、主码流和子码流区分如下图:
主码流和子码流区分图
2、各个直播协议的优缺点如下图:
直播协议优缺点
3、如果是子码流访问的话,需要将子码流的分辨率码率上限对应
对应的码率
4、-vf scale=320:240这个参数只能在将Rtsp转发为Rtmp的时候使用

5、参考链接以重要程度排序

6、其他链接:
通过flv的方式转发
vue的前端的配置

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
实现 FFmpeg + Nginx 实时转码并播放 FLV 视频,可以按照以下步骤进行配置: 1. 安装 FFmpegNginx,并启动 Nginx 服务器。 2. 在 Nginx 配置文件中添加以下内容: ``` rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; allow publish all; allow play all; exec ffmpeg -i rtmp://localhost:1935/live/$name -c:v libx264 -preset ultrafast -c:a aac -f flv rtmp://localhost:1935/hls/$name; } application hls { live on; hls on; hls_path /var/www/html/hls; hls_fragment 5s; hls_playlist_length 30s; allow play all; } } } ``` 3. 在上述配置中,`rtmp` 块用于定义 RTMP 流协议的服务器,`application live` 块用于定义实时直播的应用,`application hls` 块用于定义 HLS(HTTP Live Streaming)应用。 4. 在`application live` 块中,`live on` 参数用于启用实时直播,`exec` 指令调用 FFmpeg 进行实时转码,将 RTMP 流转换为 FLV 格式并推送到`application hls`应用的 HLS 流服务器上进行播放。 5. 在`application hls` 块中,`hls on` 参数用于启用 HLS 流协议,`hls_path` 参数用于指定存放 HLS 流的目录,`hls_fragment` 参数用于指定每个 TS 片段的时长,`hls_playlist_length` 参数用于指定 HLS 流的播放列表时长。 6. 配置完成后,可以使用 RTMP 推流软件向 Nginx 服务器推送实时直播流,例如使用 OBS Studio 软件进行推流。 7. 播放实时直播流时,可以使用以下 URL 地址: ``` http://<server-ip>/hls/<stream-name>.m3u8 ``` 其中,`<server-ip>` 是 Nginx 服务器的公网 IP 地址,`<stream-name>` 是实时直播流的名称。 以上就是使用 FFmpeg + Nginx 实现实时转码并播放 FLV 视频的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值