Docker nginx容器代理播放m3u8视频文件(HLS)

文章目录

  • Docker Nginx容器代理播放M3U8文件教程
    • 获取Nginx Docker镜像
    • 设置Nginx配置文件
    • 用 ffmpeg 将 MP4 文件转换成 m3u8 文件
    • 运行Docker容器
    • 测试M3U8流
    • 其他问题
      • 我用vlc都能播放http://192.168.121.50/forest4kTest.m3u8和http://192.168.121.50/forest4kTest.mp4,那还要m3u8做什么,直接播放视频文件不就行了吗?

Docker Nginx容器代理播放M3U8文件教程

本教程将介绍如何在Docker中使用Nginx作为反向代理,以播放M3U8文件。我们会通过步骤详细解释每个过程,并提供命令和代码示例。

获取Nginx Docker镜像

我们用dockerfile构建镜像:

(Dockerfile)

FROM nginx:1.18

然后用脚本构建镜像:

(build_docker_image.sh)

#!/bin/bash# 打印所有,包括注释
# set -v
# 打印执行命令
# set -x
# 命令出错退出
set -e
# 使用未初始化变量退出
set -u# 设置变量
IMAGE_NAME="kyai_nginx_x86"
IMAGE_TAG="v1.18_20230724"# 检查依赖
if ! [ -x "$(command -v docker)" ]; thenecho 'Error: Docker is not installed.' >&2exit 1
fi# 构建 Docker 镜像
docker build -t "${IMAGE_NAME}:${IMAGE_TAG}" .# 查看 Docker 镜像
docker images

然后可以用脚本把镜像导出为离线包:

(docker_tar.sh)

#!/bin/bash# 打印所有,包括注释
# set -v
# 打印执行命令
# set -x
# 命令出错退出
set -e
# 使用未初始化变量退出
set -uREPOSITORY="kyai_nginx_x86"
REP_TAG="v1.18_20230724"DOCKER_TAR="${REPOSITORY}-${REP_TAG}.tar"
USER=root
################################################################################
WHO=$(whoami | grep "${USER}$")
if [ -z ${WHO} ]; thenechoecho "Please change to \"${USER}\" user mode first!"echoexit 1
fiecho "REPOSITORY: ${REPOSITORY}"
echo "REP_TAG: ${REP_TAG}"
echo "docker save -o ${DOCKER_TAR}..."
docker save -o ${DOCKER_TAR} ${REPOSITORY}:${REP_TAG}
chmod 777 $DOCKER_TAR

在这里插入图片描述

设置Nginx配置文件

在运行Nginx Docker容器之前,我们需要设置一个Nginx配置文件。此文件将定义如何处理传入的HTTP请求。

创建一个新的文件nginx.conf并输入以下内容:

worker_processes 1;events {worker_connections 1024;
}http {sendfile on;server {listen 80;location / {root /usr/share/nginx/html;types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}add_header Cache-Control no-cache;add_header Access-Control-Allow-Origin *;}}
}

这个文件是一个Nginx服务器的配置文件,以下是对它的逐行解释:

  • worker_processes 1;:设置Nginx应使用的工作进程数。在大多数情况下,建议将此值设置为可用的CPU核心数。

  • events { worker_connections 1024; }:在events块中定义了每个工作进程允许的最大连接数。在这个例子中,每个工作进程允许最多1024个并发连接。

  • http { ... }http块包含了所有的HTTP相关的配置。

    • sendfile on;:启用高效的文件传输模式。当启用时,Nginx可以直接从磁盘到TCP套接字进行数据传输,而无需在用户空间复制数据。

    • server { ... }:定义了一个服务器(或虚拟主机)的配置。

      • listen 80;:该服务器监听80端口,这通常是HTTP的默认端口。

      • location / { ... }:定义了对根路径(/)的请求的处理方式。所有URL路径都匹配此位置。

        • root /usr/share/nginx/html;:定义了服务器的根目录,即所有相对URL路径的基础路径。

        • types { ... }:定义了不同文件扩展名的MIME类型。在这个例子中,.m3u8文件被标记为application/vnd.apple.mpegurl.ts文件被标记为video/mp2t

        • add_header Cache-Control no-cache;:添加一个HTTP响应头,指示客户端不要缓存响应。

        • add_header Access-Control-Allow-Origin *;:添加一个HTTP响应头,允许任何来源的跨域请求(CORS)。

这个配置文件将Nginx配置为一个简单的HTTP服务器,它可以为.m3u8和.ts文件提供服务,并禁用了响应缓存。

用 ffmpeg 将 MP4 文件转换成 m3u8 文件

假设我们有一个forest4kTest.mp4文件:

在这里插入图片描述

我们用下面命令将其转换为 m3u8 文件(我的ffmpeg版本是4.2.7-0ubuntu0.1):

ffmpeg -i forest4kTest.mp4 -codec: copy -bsf:v h264_mp4toannexb -map 0 -f segment -segment_list forest4kTest.m3u8 -segment_time 10 forest4kTest%03d.ts

在这个命令中:

  • -i forest4kTest.mp4指定输入文件。
  • -codec: copy表示不对视频进行重新编码,只是复制原始数据。
  • -bsf:v h264_mp4toannexb是一个比特流过滤器,用于将H264视频从MP4格式转换为MPEG2 TS格式,这是必需的,因为M3U8是基于TS的。
  • -map 0表示选择所有的流(例如,如果你的视频有音频和字幕)。
  • -f segment表示输出应该被分割成多个文件。
  • -segment_list output.m3u8指定输出的播放列表文件。
  • -segment_time 10表示每个TS段的最大长度(以秒为单位)。
  • forest4kTest%03d.ts是输出TS文件的名称模式。%03d将被替换为三位数的序号。

运行这个命令后,我们会得到一个名为forest4kTest.m3u8的播放列表文件,以及一系列的.ts文件。

在这里插入图片描述

运行Docker容器

我们需要写一个 run 容器的脚本,首先看看我的文件结构:

在这里插入图片描述

再看看我的run容器脚本:

(install.sh)

#!/bin/bash# 打印所有,包括注释
# set -v
# 打印执行命令
# set -x
# 命令出错退出
set -e
# 使用未初始化变量退出
set -uecho -e "\033[1;33m"
echo " _           _        _ _               _            "
echo "(_)_ __  ___| |_ __ _| | |  _ __   __ _(_)_ __ __  __"
echo "| | '_ \/ __| __/ _' | | | | '_ \ / _' | | '_ \\\\ \/ /"
echo "| | | | \__ \ || (_| | | | | | | | (_| | | | | |>  < "
echo "|_|_| |_|___/\__\__,_|_|_| |_| |_|\__, |_|_| |_/_/\_\\"
echo "                                  |___/              "
echo -e "\033[0m"USER=root
# USER_HOME=/root# --------------------------------------------------------------------------CONTAINER_NAME_NGINX="kyai_nginx"
TAR_NGINX="kyai_nginx_x86-v1.18_20230724.tar"
IMAGE_NAME_NGINX="kyai_nginx_x86"
TAG_NGINX="v1.18_20230724"
R_DEPLOY_PATH_NGINX="."# 检查是否是root
WHO=$(whoami | grep "${USER}$")
if [ -z "${WHO}" ]; thenechoecho "Please change to \"${USER}\" user mode first!"echoexit 1
fi# --------------------------------------------------------------------------# 获取脚本所在路径
SCRIPT_LOCATION=$(cd "$(dirname "$0")" || {echo "cd Failure"exit 1}pwd
)
# echo "SCRIPT_LOCATION = $SCRIPT_LOCATION"
chmod 777 ${SCRIPT_LOCATION} -R# --------------------------------------------------------------------------# Function to create container
# Arguments: $1 - Container name
#            $2 - Docker TAR filename
#            $3 - Image name
#            $4 - Image tag
#            $5 - Deploy path
#            $6 - The function to run container
function create_container {local CONTAINER_NAME="$1"local DOCKER_TAR="$2"local IMAGE_NAME="$3"local IMAGE_TAG="$4"local DEPLOY_PATH="$5"local docker_run="$6"# Check if container already existsif [[ "$(docker ps -aqf "name=^$CONTAINER_NAME$")" ]]; thenecho "Container $CONTAINER_NAME already exists."read -p "Do you want to delete it? (y/n)" answercase ${answer:0:1} iny | Y)# Stop and remove containerdocker stop $CONTAINER_NAME && docker rm $CONTAINER_NAME# Check command resultif [ $? -ne 0 ]; thenecho "Failed to stop or remove container $CONTAINER_NAME."exit 1fiecho "Container $CONTAINER_NAME stopped and removed successfully.";;*)return 0;;esacfi# Check if image already existsif ! docker images | awk '{print $1":"$2}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$"; then# Check if Docker TAR file existsif [ ! -e "${DEPLOY_PATH}/${DOCKER_TAR}" ]; thenecho "${DEPLOY_PATH}/${DOCKER_TAR} does not exist!"exit 1fiecho "Loading Docker image from ${DOCKER_TAR}..."docker load -i "${DEPLOY_PATH}/${DOCKER_TAR}"if [ $? -ne 0 ]; thenecho "Failed to load Docker image from ${DOCKER_TAR}!"exit 1fifiecho "Docker image ${IMAGE_NAME}:${IMAGE_TAG} already exists."# run container$docker_run "$CONTAINER_NAME" "$DOCKER_TAR" "$IMAGE_NAME" "$IMAGE_TAG" "$DEPLOY_PATH"if [ $? -ne 0 ]; thenecho "$docker_run error!"exit 1fi
}# --------------------------------------------------------------------------# 部署 nginx 服务# The function to run container of nginx
# Arguments: $1 - Container name
#            $2 - Docker TAR filename
#            $3 - Image name
#            $4 - Image tag
#            $5 - Deploy path
function docker_run_nginx {local CONTAINER_NAME="$1"local DOCKER_TAR="$2"local IMAGE_NAME="$3"local IMAGE_TAG="$4"local DEPLOY_PATH="$5"docker run -d \--restart=always \-p 80:80 \-v $SCRIPT_LOCATION/$R_DEPLOY_PATH_NGINX/mount/m3u8/files:/usr/share/nginx/html \-v $SCRIPT_LOCATION/$R_DEPLOY_PATH_NGINX/mount/conf/nginx.conf:/etc/nginx/nginx.conf \--name $CONTAINER_NAME \$IMAGE_NAME:$IMAGE_TAG# -v $SCRIPT_LOCATION/$R_DEPLOY_PATH_NGINX/../web/html/web:/ky/java/nginx/html/web \if [ $? -ne 0 ]; thenecho "docker run $CONTAINER_NAME error!"exit 1fiecho "docker run $CONTAINER_NAME [$IMAGE_NAME:$IMAGE_TAG] successfully."
}create_container "$CONTAINER_NAME_NGINX" "$TAR_NGINX" "$IMAGE_NAME_NGINX" "$TAG_NGINX" "$SCRIPT_LOCATION/$R_DEPLOY_PATH_NGINX" docker_run_nginx
if [ $? -ne 0 ]; thenecho "Container $CONTAINER_NAME_NGINX create failed."exit 1
fiecho
echo "$CONTAINER_NAME_NGINX deploy successfully"
echo

这个脚本将启动一个新的Docker容器,并映射主机的80端口到容器的80端口。

运行脚本后,我们可以看到如下结果:

在这里插入图片描述

测试M3U8流

可以通过访问http://localhost:80/yourfile.m3u8http://ipaddress:80/yourfile.m3u8来播放m3u8文件(80端口也可以省略掉)。

比如,我在windows上用VLC打开http://192.168.121.50/forest4kTest.m3u8(其中192.168.121.50是我Net模式虚拟机的ip地址):

在这里插入图片描述
在这里插入图片描述

m3u8视频流能被播放出来。

其他问题

我用vlc都能播放http://192.168.121.50/forest4kTest.m3u8和http://192.168.121.50/forest4kTest.mp4,那还要m3u8做什么,直接播放视频文件不就行了吗?

确实,使用直接的视频链接(如.mp4文件)可以在许多情况下播放视频。然而,M3U8作为HTTP Live Streaming(HLS)协议的一部分,提供了许多其他优势和高级功能,包括:

  1. 自适应流媒体:M3U8允许提供不同质量和分辨率的视频流,以适应各种网络条件和设备能力。客户端可以在播放过程中无缝切换不同质量的流,以优化用户体验。

  2. 实时或点播流:M3U8可以用于实时的流媒体广播,也可以用于点播内容。

  3. 容错性:由于M3U8将媒体内容分割成多个小段,所以即使在下载过程中出现问题,也只会影响到当前的段,而不是整个视频。

  4. 加密:M3U8支持对媒体段进行AES-128或SAMPLE-AES加密,以保护内容安全。

  5. 跨平台和广泛支持:M3U8和HLS协议被广泛地支持,在各种设备和平台上都可以播放,包括iOS、Android、Windows、macOS等。

因此,虽然在某些情况下,直接链接到视频文件可能更简单,但使用M3U8和HLS协议可以提供更强大和灵活的流媒体解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/231756.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HBase】——优化

1 RowKey设计 重要&#xff1a;一条数据的唯一标识就是 rowkey&#xff0c;那么这条数据存储于哪个分区&#xff0c;取决于 rowkey 处于 哪个一个预分区的区间内&#xff0c;设计 rowkey的主要目的 &#xff0c;就是让数据均匀的分布于所有的 region 中&#xff0c;在一定程度…

HTML 使用 ruby 给汉字加拼音

使用 ruby 给汉字加拼音 兼容性 使用 ruby 给汉字加拼音 大家有没有遇到过要给汉字头顶上加拼音的需求? 如果有的话, 你是怎么解决的呢? 如果费尽心思, 那么你可能走了很多弯路, 因为 HTML 原生就有这样的标签来帮我们实现类似的需求. <ruby> ruby 本身是「红宝石」…

大学物理-实验篇——测量误差与数据处理(测量分类、误差、有效数字、逐差法)

目录 测量分类 测量次数角度 测量条件角度 误差 误差分类 系统误差 随机误差 异常值 误差描述 精密度&#xff08;Precision&#xff09; 正确度&#xff08;Trueness&#xff09; 准确度/精确度&#xff08;Accuracy&#xff09; 随机误差的处理 直接测量 算术…

一起玩儿物联网人工智能小车(ESP32)——27. 旋转编码器的使用方法

摘要&#xff1a;本文介绍旋转编码器的使用方法 旋转编码器是一种机电设备&#xff0c;可将轴或轴的角位置或运动转换为模拟或数字输出信号&#xff0c;在工业控制中发挥着举足轻重的作用。旋转编码器目前被广泛的应用在数控机床、印刷设备、包装机械、输送带、电梯、机器人、风…

WeNet语音识别+Qwen-72B-Chat Bot+Sambert-Hifigan语音合成

WeNet语音识别Qwen-72B-Chat Bot&#x1f47e;Sambert-Hifigan语音合成 简介 利用 WeNet 进行语音识别&#xff0c;使用户能够通过语音输入与系统进行交互。接着&#xff0c;Qwen-72B-Chat Bot作为聊天机器人接收用户的语音输入或文本输入&#xff0c;提供响应并与用户进行对话…

Docker overlay2文件busy,容器不能删除问题解决

文章目录 在删除docker容器的时候报错,说设备正忙通过 docker ps -a 查看有两个状态的dead的容器解决方法&#xff1a;1.查看所有挂载的设备2.截取设备的进程id3.清理进程(kill掉即可) 在删除docker容器的时候报错,说设备正忙 Error response from daemon: Driver overlay2 fai…

【ARMv8架构系统安装PySide2】

ARMv8架构系统安装PySide2 Step1. 下载Qt资源包Step2. 配置和安装Qt5Step3. 检查Qt-5.15.2安装情况Step4. 安装PySide2所需的依赖库Step5. 下载和配置PySide2Step6. 检验PySide2是否安装成功 Step1. 下载Qt资源包 if you need the whole Qt5 (~900MB): wget http://master.qt…

Meshlab界面和菜单初步认识

文章目录 界面认识菜单 界面认识 顾名思义&#xff0c;MeshLab即网格实验室&#xff0c;用于处理三维对象&#xff0c;并有着针对网格基于网格操作的各种工具&#xff0c;是一个功能强大的三维几何处理系统。因其开源&#xff0c;直接搜官网下载即可。安装过程无坑&#xff0c…

vue icon 本地正常 线上打包失败变乱码

出现这个原因是因为sass解析的问题 Node版本高的话可以通过升级sass版本 并且配置vue.config规避这个问题 //给sass配置的东西 这个对应的版本是sass 1.39.0 本人node版本v14 升级sass版本后出现报错css: {loaderOptions: {scss: {additionalData: import "/styles/var…

C#,入门教程(10)——常量、变量与命名规则的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(09)——运算符的基础知识https://blog.csdn.net/beijinghorn/article/details/123908269 C#用于保存计算数据的元素&#xff0c;称为“变量”。 其中一般不改变初值的变量&#xff0c;称为常变量&#xff0c;简称“常量”。 无论…

nginx 二、配置域名

文章目录 一、配置本地域名查看虚拟机ip修改hosts文件测试域名是否配置成功 二、配置aliyun域名三、实践1.创建html2.配置nginx3.测试服务器内部测试页面测试 总结 docker中启动nginx容器完成如下操作&#xff0c;对于docker安装nginx可以看这篇文章 nginx 一、安装与conf浅析 …

zookeeper应用场景之分布式的ID生成器

1. 分布式ID生成器的使用场景 在分布式系统中&#xff0c;分布式ID生成器的使用场景非常之多&#xff1a; 大量的数据记录&#xff0c;需要分布式ID。大量的系统消息&#xff0c;需要分布式ID。大量的请求日志&#xff0c;如restful的操作记录&#xff0c;需要唯一标识&#x…

element中Tree 树形控件实现多选、展开折叠、全选全不选、父子联动、默认展开、默认选中、默认禁用、自定义节点内容、可拖拽节点、手风琴模式

目录 1.代码实现2. 效果图3. 使用到的部分属性说明4. 更多属性配置查看element官网 1.代码实现 <template><div class"TreePage"><el-checkboxv-model"menuExpand"change"handleCheckedTreeExpand($event, menu)">展开/折叠&l…

如何保障集团下达的政策要求有效落地

随着新一轮国企改革的推进&#xff0c;很多国有企业建立了集团化的管控体系。通过集团化经营管理的模式&#xff0c;帮助国有企业凝聚更强的竞争力&#xff0c;集团企业通过资源整合、反向投资、控股、参股等手法创造业务板块之间的协同、互补效应&#xff0c;从而实现战略联动…

gitlab 配置 二

一 环境说明 群晖Nas DS418DELL XPS serverGitlab ce 二 需要实现的功能 外网可以访问&#xff0c;gitlab使用https的方式访问。wiki issue 等都可以上传图片和附件。 三 操作步骤 因为群晖上有证书&#xff0c;并且由群晖做转发功能。因此证书上&#xff0c;采用群晖的证书…

Sqlmap参数设置

Sqlmap参数设置 &#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; --------------------------------------------注意---------…

RBAC基于角色的访问控制

一 什么是RBAC 概念 RBAC 是基于角色的访问控制&#xff08;Role-Based Access Control &#xff09;在 RBAC 中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的&#…

【论文阅读笔记】医学多模态新数据集-Large-scale Long-tailed Disease Diagnosis on Radiology Images

这是复旦大学2023.12.28开放出来的数据集和论文&#xff0c;感觉很宝藏&#xff0c;稍微将阅读过程记录一下。 Zheng Q, Zhao W, Wu C, et al. Large-scale Long-tailed Disease Diagnosis on Radiology Images[J]. arXiv preprint arXiv:2312.16151, 2023. 项目主页&#xf…

智慧校园的“边缘智能“: 打造未来教育的桥梁

在科技飞速发展的时代&#xff0c;智能已经渗透到我们生活的各个角落。而当智能遇上教育&#xff0c;会激发出怎样的火花呢&#xff1f;今天&#xff0c;我们就来聊聊这个热门话题——智慧校园和边缘智能网关的结合&#xff0c;它们是如何共同塑造未来教育的新形态。 什么是边…

Dubbo入门介绍和实战

1. 引言 Dubbo是一款开源的高性能、轻量级的Java RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;旨在解决分布式服务之间的通信问题。本文将介绍Dubbo的基础概念、核心特性以及使用场景&#xff0c;包括实际示例演示。 2. 什么是Dubbo&#xff1f; Dubbo是阿里巴…