基于Docker部署M3U8流媒体

本方案基于 Docker + Nginx-RTMP + Nginx,实现将本地 MP4 文件转换为 24/7 循环播放的 HLS (M3U8) 直播流。

一、 环境准备

1、操作系统:

  • 已安装宝塔面板的 Linux 服务器(推荐 CentOS 7+ 或 Ubuntu 20.04+)。

2、基础软件:

  • 宝塔面板内已安装 Nginx。
  • 系统已安装 Docker(可在宝塔"软件商店"一键安装)。
  • 系统已安装 FFmpeg(支持libx264的版本)

下载支持 libx264 的 FFmpeg:

https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz

解压后,将 ffmpeg 和 ffprobe 复制到 /usr/bin 目录下。

二、启动 Docker 容器

在终端执行以下命令,启动 RTMP 转流服务器。需要将 Docker 内部的流文件目录映射到宝塔的站点目录下,方便直接访问。

注意 :先创建 /hls 文件夹。

bash 复制代码
docker run -d --name nginx-rtmp \
  -p 1935:1935 \
  -p 8088:8080 \
  -v /projects/nginx.conf:/etc/nginx/nginx.conf \
  -v /projects/hls:/opt/data/hls \
  alfg/nginx-rtmp

启动后会生成 /projects/nginx.conf

里面包含推流的链接示例:

bash 复制代码
rtmp://localhost:1935/stream/$name

查看 docker 输出:

bash 复制代码
docker logs --tail 200 nginx-rtmp

三、设置 hls 目录权限

用 ACL 的"默认权限(default ACL)",让将来新生成的所有文件/目录自动拥有权限,后面nginx访问不会再报错403/Permission denied

bash 复制代码
# 安装 ACL
yum -y install acl
# 永久读写执行权限
setfacl -R -m u:www:rwx /projects/hls
# 保证新文件也有权限
setfacl -R -d -m u:www:rwx /projects/hls
# 验证
getfacl /projects/hls | sed -n '1,20p'

四、启动 FFmpeg 循环推流

使用 FFmpeg 对视频裁剪+转码:

bash 复制代码
ffmpeg -i video.mp4 -t 00:15:00 -c:v libx264 -c:a aac output.mp4

启动循环推流:

bash 复制代码
nohup ffmpeg -re -stream_loop -1 -i /projects/input.mp4  -c:v libx264 -preset veryfast -tune zerolatency  -profile:v baseline -level 3.1 -g 60 -keyint_min 60 -sc_threshold 0 -c:a aac -b:a 128k -ar 44100 -f flv "rtmp://127.0.0.1:1935/stream/test" > /tmp/log1.txt 2>&1 &

性能优化建议:

如果服务器 CPU 较弱,且 MP4 已经是 H.264 编码,可以将 -c:v libx264 改为 -c:v copy,这样可以极大降低 CPU 占用。

查看 /projects/hls 目录,看是否有生成 M3U8 文件和 ts 文件。

五、宝塔 Nginx 配置(HTTP / HTTPS 播放)

在 宝塔 → 网站 → 你的站点 → 配置文件 中加入:

bash 复制代码
location ^~ /hls/ {
    alias /projects/hls/;

    types {
        application/vnd.apple.mpegurl m3u8;
        video/mp2t ts;
    }

    add_header Cache-Control no-cache;
    add_header Access-Control-Allow-Origin * always;

    if ($request_method = OPTIONS) { return 204; }

    disable_symlinks off;
}

查看 nginx 错误输出:

bash 复制代码
tail -n 30 /www/wwwlogs/my.domain.com.error.log

六、 播放与验证

直播流生成的地址如下,您可以使用 VLC 播放器或网页 HLS 播放器测试:

  • 视频流 :http://你的域名/hls/test_****/index.m3u8

在服务器上使用CURL指令测试视频流链接是否返回200

bash 复制代码
curl -I http://my.domain.com/hls/test_240p264kbs/index.m3u8

前端HTML嵌入视频流:

html 复制代码
<video 
    controls 
    autoplay 
    muted 
    loop 
    playsinline>
    <source src="http://my.domain.com/hls/test_720p2628kbs/index.m3u8" type="application/x-mpegURL">
    您的浏览器不支持 HLS 原生播放。
</video>
相关推荐
IT19952 小时前
Docker 快速部署 DM8 达梦数据库|完整踩坑笔记
笔记·docker·容器
wzg20162 小时前
ubuntu通过docker镜像部署安装onlyoffice
linux·ubuntu·docker
Star(up up up)2 小时前
Docker系列---Docker容器基本命令(新手小白保姆级实操教程)
运维·学习·程序人生·青少年编程·docker·容器·dubbo
方便面不加香菜4 小时前
Docker Image-- 镜像命令详解与使用示例
运维·docker·容器
Star(up up up)4 小时前
Docker系列---Dockerfile镜像文件
人工智能·经验分享·学习·程序人生·docker·容器·github
-星空下无敌4 小时前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba
芥子沫4 小时前
从零开始用 Docker 部署 Hoppscotch:自建 API 调试平台的完整教程
docker·接口测试·api开发·api管理
yujunlong39194 小时前
[特殊字符] Serverpod 4.1.0 全栈项目开发与 Docker 部署规范文档
flutter·docker·serverpod
吴声子夜歌5 小时前
Kubernetes权威指南——深入掌握Pod(使用StatefulSet搭建MongoDB集群)
容器·kubernetes
fb_123455 小时前
K8s动态卷供应实战_StorageClass与LocalPath_NFS双Provisioner
云原生·容器·kubernetes