master
wanggang 4 years ago
commit 4fdce9e67c

1
.gitignore vendored

@ -0,0 +1 @@
tmp

@ -0,0 +1,38 @@
ARG BUILD_IMAGE=ossrs/srs:dev
ARG IMAGE=ubuntu:18.04
FROM $BUILD_IMAGE as build
ARG BRANCH=4.0release
RUN yum install -y git
##release 4.0
RUN git clone --depth 1 -b $BRANCH https://github.com/ossrs/srs.git
RUN cd srs/trunk && ./configure && make
FROM $IMAGE
LABEL org.opencontainers.image.authors="76527413@qq.com"
RUN sed -i s/archive.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
sed -i s/security.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
apt update -y && \
apt install -y --fix-missing libxml2-dev liblzma-dev && \
rm -rf /var/lib/apt/lists/*
WORKDIR /usr/local/srs
EXPOSE 1935 1985 8080
COPY --from=build /tmp/srs/srs/trunk/objs/srs ./objs/srs
COPY --from=build /tmp/srs/srs/trunk/objs/nginx/html/index.html ./objs/nginx/html/index.html
COPY --from=build /tmp/srs/srs/trunk/research/players/crossdomain.xml ./objs/nginx/html/crossdomain.xml
COPY --from=build /tmp/srs/srs/trunk/conf/docker.conf ./conf/srs.conf
COPY --from=build /tmp/srs/srs/trunk/etc ./etc
COPY --from=build /tmp/srs/srs/trunk/usr ./usr
COPY --from=build /tmp/srs/srs/trunk/research/api-server/static-dir ./objs/nginx/html
COPY --from=build /tmp/srs/srs/trunk/research/console ./objs/nginx/html/console
COPY --from=build /tmp/srs/srs/trunk/research/players ./objs/nginx/html/players
COPY --from=build /tmp/srs/srs/trunk/3rdparty/signaling/www/demos ./objs/nginx/html/demos
COPY --from=build /usr/local/bin/ffmpeg ./objs/ffmpeg/bin/ffmpeg
CMD ./objs/srs -c ./conf/srs.conf

@ -0,0 +1,43 @@
ARG BUILD_IMAGE=ossrs/srs:aarch64
ARG IMAGE=arm64v8/ubuntu:18.04
FROM multiarch/qemu-user-static:x86_64-aarch64 as qemu
FROM $BUILD_IMAGE as build
ARG BRANCH=4.0release
COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
RUN sed -i s/archive.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
sed -i s/security.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
apt update -qqy && \
apt install -y git
RUN git clone --depth 1 -b $BRANCH https://github.com/ossrs/srs.git
RUN cd srs/trunk && ./configure && make
FROM $IMAGE
COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
LABEL org.opencontainers.image.authors="76527413@qq.com"
RUN sed -i s/ports.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
apt update -y && \
apt install -y --fix-missing libxml2-dev liblzma-dev && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /usr/bin/qemu-aarch64-static
WORKDIR /usr/local/srs
EXPOSE 1935 1985 8080
COPY --from=build /tmp/srs/srs/trunk/objs/srs ./objs/srs
COPY --from=build /tmp/srs/srs/trunk/objs/nginx/html/index.html ./objs/nginx/html/index.html
COPY --from=build /tmp/srs/srs/trunk/research/players/crossdomain.xml ./objs/nginx/html/crossdomain.xml
COPY --from=build /tmp/srs/srs/trunk/conf/docker.conf ./conf/srs.conf
COPY --from=build /tmp/srs/srs/trunk/etc ./etc
COPY --from=build /tmp/srs/srs/trunk/usr ./usr
COPY --from=build /tmp/srs/srs/trunk/research/api-server/static-dir ./objs/nginx/html
COPY --from=build /tmp/srs/srs/trunk/research/console ./objs/nginx/html/console
COPY --from=build /tmp/srs/srs/trunk/research/players ./objs/nginx/html/players
COPY --from=build /tmp/srs/srs/trunk/3rdparty/signaling/www/demos ./objs/nginx/html/demos
COPY --from=build /usr/local/bin/ffmpeg ./objs/ffmpeg/bin/ffmpeg
CMD ./objs/srs -c ./conf/srs.conf

@ -0,0 +1,38 @@
ARG BUILD_IMAGE=ossrs/srs:dev
ARG IMAGE=ubuntu:18.04
FROM $BUILD_IMAGE as build
ARG BRANCH=feature/gb28181
RUN yum install -y git
##gb28181:https://github.com/ossrs/srs/issues/1500#issue-528623588
RUN git clone --depth 1 -b $BRANCH https://github.com/ossrs/srs.git
RUN cd srs/trunk && ./configure --with-gb28181 && make
FROM $IMAGE
LABEL org.opencontainers.image.authors="76527413@qq.com"
RUN sed -i s/archive.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
sed -i s/security.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
apt update -y && \
apt install -y --fix-missing libxml2-dev liblzma-dev && \
rm -rf /var/lib/apt/lists/*
WORKDIR /usr/local/srs
EXPOSE 1935 1985 8080
COPY --from=build /tmp/srs/srs/trunk/objs/srs ./objs/srs
COPY --from=build /tmp/srs/srs/trunk/objs/nginx/html/index.html ./objs/nginx/html/index.html
COPY --from=build /tmp/srs/srs/trunk/research/players/crossdomain.xml ./objs/nginx/html/crossdomain.xml
COPY --from=build /tmp/srs/srs/trunk/conf/docker.conf ./conf/srs.conf
COPY --from=build /tmp/srs/srs/trunk/etc ./etc
COPY --from=build /tmp/srs/srs/trunk/usr ./usr
COPY --from=build /tmp/srs/srs/trunk/research/api-server/static-dir ./objs/nginx/html
COPY --from=build /tmp/srs/srs/trunk/research/console ./objs/nginx/html/console
COPY --from=build /tmp/srs/srs/trunk/research/players ./objs/nginx/html/players
COPY --from=build /tmp/srs/srs/trunk/3rdparty/signaling/www/demos ./objs/nginx/html/demos
COPY --from=build /usr/local/bin/ffmpeg ./objs/ffmpeg/bin/ffmpeg
CMD ./objs/srs -c ./conf/srs.conf

@ -0,0 +1,40 @@
ARG BUILD_IMAGE=ossrs/srs:dev
ARG IMAGE=ubuntu:18.04
FROM $BUILD_IMAGE as build
ARG BRANCH=feature/h265
RUN yum install -y git
##h265:https://github.com/ossrs/srs/issues/2053
RUN git clone --depth 1 -b $BRANCH https://github.com/ossrs/srs.git
RUN cd srs && sed -i '1455s#vcodec->NAL_unit_length#nal_len_size#' ./trunk/src/kernel/srs_kernel_codec.cpp
RUN cd srs/trunk && ./configure && make
FROM $IMAGE
LABEL org.opencontainers.image.authors="76527413@qq.com"
RUN sed -i s/archive.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
sed -i s/security.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list && \
apt update -y && \
apt install -y --fix-missing libxml2-dev liblzma-dev && \
rm -rf /var/lib/apt/lists/*
WORKDIR /usr/local/srs
EXPOSE 1935 1985 8080
COPY --from=build /tmp/srs/srs/trunk/objs/srs ./objs/srs
COPY --from=build /tmp/srs/srs/trunk/objs/nginx/html/index.html ./objs/nginx/html/index.html
COPY --from=build /tmp/srs/srs/trunk/research/players/crossdomain.xml ./objs/nginx/html/crossdomain.xml
COPY --from=build /tmp/srs/srs/trunk/conf/docker.conf ./conf/srs.conf
COPY --from=build /tmp/srs/srs/trunk/etc ./etc
COPY --from=build /tmp/srs/srs/trunk/usr ./usr
COPY --from=build /tmp/srs/srs/trunk/research/api-server/static-dir ./objs/nginx/html
COPY --from=build /tmp/srs/srs/trunk/research/console ./objs/nginx/html/console
COPY --from=build /tmp/srs/srs/trunk/research/players ./objs/nginx/html/players
COPY --from=build /tmp/srs/srs/trunk/3rdparty/signaling/www/demos ./objs/nginx/html/demos
COPY --from=build /usr/local/bin/ffmpeg ./objs/ffmpeg/bin/ffmpeg
CMD ./objs/srs -c ./conf/srs.conf

@ -0,0 +1,69 @@
# srs
1. <https://github.com/ossrs/srs/blob/4.0release/trunk/conf/docker.conf>
1. <https://github.com/ossrs/srs/blob/4.0release/trunk/conf/full.conf>
## docker 调用 dvr api 崩溃的问题
挂载配置文件时,不能直接挂载配置文件,必须采取挂载配置文件目录的方式
## 截图无法自动创建路径的问题
通过配置 hls_ts_file 或 dvr_path 间接创建
## dvr_path
### dvr_path
srs dvr 路径可以使用变量,[vhost] [app] [stream] [timestamp] 正常使用即可。
年、月、日、时、分、秒、毫秒则使用以下变量:[2006] [01] [02] [15] [04] [05] [999]。必须这么写,不存在[year]之类的,例如,要想插入年份必须使用[2006]。
### 监控场景
自动录像、按日期存储、按时间分割
```
dvr {
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]/[app].[stream].[2006].[01].[02].[15].[04].[05].[999].mp4;
dvr_apply all;
dvr_plan segment;
#seconds
dvr_duration 60;
}
```
### 直播场景
自动录像、按会话存储,也可以按时间分割
```
dvr {
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]/[app].[stream].[2006].[01].[02].[15].[04].[05].[999].mp4;
dvr_apply none;
}
```
### 精确控制
通过 [http api](https://github.com/ossrs/srs/wiki/v4_CN_HTTPApi#raw-dvr) 控制每个流的开始录制和停止录制
```
dvr {
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]/[app].[stream].[2006].[01].[02].[15].[04].[05].[999].mp4;
dvr_apply none;
}
```
## arm64
参考:<https://github.com/ossrs/srs-docker/tree/aarch64>
Raspberry Pi 安装64位操作系统<https://downloads.raspberrypi.org/raspios_arm64/images/>
安装 Docker Engine <https://docs.docker.com/engine/install/debian/>
安装 Docker Compose <https://github.com/wojiushixiaobai/docker-compose-aarch64>

@ -0,0 +1,3 @@
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker build --progress=plain -t 76527413/srs:amd64 .
docker build --progress=plain -f Dockerfile.arm64 -t 76527413/srs:arm64 .

@ -0,0 +1,91 @@
listen 1935;
max_connections 1000;
srs_log_tank console;
daemon off;
http_api {
enabled on;
raw_api {
enabled on;
allow_reload on;
allow_query on;
allow_update on;
}
}
http_server {
enabled on;
}
stats {
enabled on;
disk sda sdb xvda xvdb;
}
rtc_server {
enabled on;
candidate $CANDIDATE;
}
vhost __defaultVhost__ {
hls {
enabled on;
}
http_remux {
enabled on;
}
rtc {
enabled on;
rtc_to_rtmp on;
}
play {
mw_latency 100;
mw_msgs 4;
gop_cache off;
queue_length 10;
}
publish {
mr off;
}
transcode live {
enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine snapshot {
enabled on;
iformat flv;
vfilter {
vf fps=1;
}
vcodec png;
vparams {
vframes 1;
}
acodec an;
oformat image2;
output ./objs/nginx/html/[app]/[stream]/[stream].png;
}
engine mobile {
enabled on;
vfilter;
vcodec libx264;
vbitrate 500;
vfps 25;
vwidth 204;
vheight 360;
vthreads 12;
vprofile main;
vpreset medium;
vparams;
acodec libfdk_aac;
abitrate 70;
asample_rate 44100;
achannels 2;
aparams;
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
}
}
dvr {
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]/[app].[stream].[2006].[01].[02].[15].[04].[05].[999].mp4;
dvr_apply none;
}
http_hooks {
enabled on;
on_dvr http://nginx?on_dvr;
}
}

@ -0,0 +1,143 @@
# push gb28181 stream to SRS.
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8080;
}
stats {
network 0;
}
stream_caster {
enabled on;
caster gb28181;
# 转发流到rtmp服务器地址与端口
# TODO: https://github.com/ossrs/srs/pull/1679/files#r400875104
# [stream] is VideoChannelCodecID(视频通道编码ID) for sip
# 自动创建的道通[stream] 是chid[ssrc] [ssrc]是rtp的ssrc
# [ssrc] rtp中的ssrc
output rtmp://127.0.0.1:1935/live/[stream];
# 接收设备端rtp流的多路复用端口
listen 9000;
# 多路复用端口类型on为tcpoff为udp
# 默认off
tcp_enable on;
# rtp接收监听端口范围最小值
rtp_port_min 58200;
# rtp接收监听端口范围最大值
rtp_port_max 58300;
# 是否等待关键帧之后,再转发,
# off:不需等待,直接转发
# on:等第一个关键帧后,再转发
wait_keyframe on;
# rtp包空闲等待时间如果指定时间没有收到任何包
# rtp监听连接自动停止发送BYE命令
rtp_idle_timeout 30;
# 是否转发音频流
# 目前只支持aac格式所以需要设备支持aac格式
# on:转发音频
# off:不转发音频,只有视频
# *注意*!!!:flv 只支持11025 22050 44100 三种
# 如果设备端没有三种中任何一个,转发时为自动选择一种格式
# 同时也会将adts的头封装在flv aac raw数据中
# 这样的话播放器为自动通过adts头自动选择采样频率
# 像ffplay, vlc都可以但是flash是没有声音
# 因为flash,只支持11025 22050 44100
audio_enable off;
# 是否开启rtp缓冲
# 开启之后能有效解决rtp乱序等问题
# tcp模式建议关闭
jitterbuffer_enable off;
# 服务器主机号可以域名或ip地址
# 也就是设备端将媒体发送的地址,如果是服务器是内外网
# 需要写外网地址,
# 调用api创建stream session时返回ip地址也是host
# $CANDIDATE 是系统环境变量,从环境变量获取地址,如果没有配置,用*
# *代表指定stats network 的网卡号地址如果没有配置network默认则是第0号网卡地址
# TODO: https://github.com/ossrs/srs/pull/1679/files#r400917594
host $CANDIDATE;
#根据收到ps rtp包自带创建rtmp媒体通道不需要api接口创建
#rtmp地址参数[stream] 就是通道id 格式chid[ssrc]
auto_create_channel off;
sip {
# 是否启用srs内部sip信令
# 为on信令走srs, off 只转发ps流
enabled on;
# sip监听udp端口
listen 5060;
# SIP server ID(SIP服务器ID).
# 设备端配置编号需要与该值一致,否则无法注册
serial 34020000002000000001;
# SIP server domain(SIP服务器域)
realm 3402000000;
# 服务端发送ack后接收回应的超时时间单位为秒
# 如果指定时间没有回应,认为失败
ack_timeout 30;
# 设备心跳维持时间,如果指定时间内(秒)没有接收一个心跳
# 认为设备离线
keepalive_timeout 120;
# 注册之后是否自动给设备端发送invite
# on: 是 off 不是需要通过api控制
auto_play on;
# 设备将流发送的端口,是否固定
# on 发送流到多路复用端口 如9000
# off 自动从rtp_mix_port - rtp_max_port 之间的值中
# 选一个可以用的端口
invite_port_fixed on;
# 向设备或下级域查询设备列表的间隔,单位(秒)
# 默认60秒
query_catalog_interval 60;
}
}
rtc_server {
enabled on;
# Listen at udp://8000
listen 8000;
#
# The $CANDIDATE means fetch from env, if not configed, use * as default.
#
# The * means retrieving server IP automatically, from all network interfaces,
# @see https://github.com/ossrs/srs/issues/307#issuecomment-599028124
candidate $CANDIDATE;
}
vhost __defaultVhost__ {
rtc {
enabled on;
bframe discard;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}

@ -0,0 +1,52 @@
version: "3.8"
services:
srs:
#image: ossrs/srs:v4.0.136
#image: 76527413/srs:amd64
#image: 76527413/srs:arm64
#image: 76527413/srs:gb28181
image: 76527413/srs:h265
environment:
- CANDIDATE=192.168.100.144
ports:
- 1935:1935
- 1985:1985
#- 1990:1990
- 8080:8080
#- 8088:8088
- 8000:8000/udp
- 1980:1980/udp
- 8935:8935/udp
- 554:554
- 8936:8936
- 5060:5060/udp
- 9000:9000/udp
- 58200-58300/udp
- 10080:10080/udp
volumes:
- /etc/localtime:/etc/localtime:ro
- ./conf/example:/usr/local/srs/conf
#- ./conf/gb28181:/usr/local/srs/conf
- ./tmp/srs:/usr/local/srs/objs/nginx/html/live
ffmpeg-h264:
image: 76527413/ffmpeg:amd64
volumes:
- ./h264.mp4:/test.mp4
command: ffmpeg -y -re -stream_loop -1 -i test.mp4 -c:a copy -c:v copy -f flv rtmp://srs/live/h264
depends_on:
- srs
ffmpeg-265:
image: 76527413/ffmpeg:amd64
volumes:
- ./h265.mp4:/test.mp4
command: ffmpeg -y -re -stream_loop -1 -i test.mp4 -c:a copy -c:v copy -f flv rtmp://srs/live/h265
depends_on:
- srs
nginx:
image: nginx:1.21.0
ports:
- 80:80
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- ffmpeg

Binary file not shown.

Binary file not shown.

@ -0,0 +1,7 @@
#!/bin/bash
TAG=$GIT_BRANCH.$DOCKER_TAG
VERSION=4.0
for tag in {$TAG.$VERSION,$TAG.$(git rev-parse --short HEAD),$TAG.$(date -u +"%Y-%m-%dT%H-%M-%SZ")}; do
docker tag $IMAGE_NAME $DOCKER_REPO:$tag
docker push $DOCKER_REPO:$tag
done

@ -0,0 +1,4 @@
#!/bin/bash
if [ $DOCKER_TAG = arm64 ]; then
docker run --rm --privileged multiarch/qemu-user-static:register --reset
fi

File diff suppressed because one or more lines are too long

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EasyWasmPlayer</title>
<script src="./EasyWasmPlayer.js"></script>
</head>
<body>
<div style="text-align: center;">
<div style="width:540px;height: 1170px; background-color:pink;margin: auto;display: inline-block;">
<div id="newplay1" onClick="onplay"></div>
<input type="text" id="value1" value="http://127.0.0.1:8080/live/h264.flv"
style="width: 80%;box-sizing: border-box;">
<button id="btn1" style="width: 18%;box-sizing: border-box;">播放</button>
</div>
<div style="width:540px;height: 1170px; background-color:pink;margin: auto;display: inline-block;">
<div id="newplay2" onClick="onplay"></div>
<input type="text" id="value2" value="http://127.0.0.1:8080/live/h265.flv"
style="width: 80%;box-sizing: border-box;">
<button id="btn2" style="width: 18%;box-sizing: border-box;">播放</button>
</div>
</div>
<script>
document.getElementById('value1').value=location.protocol + "//" +location.host + ":8080" +"/live/h264.flv";
document.getElementById('value2').value=location.protocol + "//" +location.host + ":8080" +"/live/h265.flv";
callbackfun = function (e) {
//console.log(e);
}
var player1;
var player2;
function play1() {
if (player1) {
player1.destroy();
}
player1 = new WasmPlayer(null, 'newplay1', callbackfun, {
Height: true
});
var url = document.getElementById('value1').value;
player1.play(url, 1);
}
btn1.onclick = function () {
play1();
}
function play2() {
if (player2) {
player2.destroy();
}
player2 = new WasmPlayer(null, 'newplay2', callbackfun, {
Height: true
});
var url = document.getElementById('value2').value;
player2.play(url, 1);
}
btn2.onclick = function () {
play2();
}
play1();
play2();
</script>
</body>
</html>

@ -0,0 +1,138 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://nbaxp.github.io/assets/css/style.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css">
<style>
.col-6 {
border: 1px solid #666;
text-align: center;
}
video {
max-width: 100%;
height: 400px;
margin: 0 auto;
}
img {
display: inline-block;
height: 100px;
vertical-align: middle;
border: 1px solid gray;
}
</style>
<title>live</title>
</head>
<body>
<div id="app" class="container-lg px-3 my-5 markdown-body gitpages" style="overflow: hidden;">
<div class="container">
<div class="row"><a target="_blank" href="http://localhost:8080/console/">http://localhost:8080/console/</a>
</div>
<div class="row"><a target="_blank" href="http://localhost:8080/live/test/test.png">截图:<img
src="http://localhost:8080/live/test/test.png"></a></div>
<div class="row">
<div class="col-6">
<div class="input-group mt-3">
<input id="flvUrl" class="form-control" type="text" value="http://localhost:8080/live/test.flv">
<button id="playFlv" class="input-group-text">Play</button>
</div>
<video id="videoElement" muted autoplay controls></video>
</div>
<div class="col-6">
<div class="input-group mt-3">
<input id="hlsUrl" class="form-control" type="text"
value="http://localhost:8080/live/test.m3u8">
<button id="playHls" class="input-group-text">Play</button>
</div>
<video id="video" muted autoplay controls></video>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.5.0/dist/flv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/hls.js@1.0.7/dist/hls.min.js"></script>
<script>
var flvPlayer;
var hlsPlayer;
function playFlv() {
var url = $('#flvUrl').val();
if (!flvjs.isSupported()) {
console.error('flvjs is not supported');
return;
}
if (flvPlayer) {
try {
flvPlayer.pause();
} catch (e) {
console.error(e);
}
flvPlayer.unload();
flvPlayer.detachMediaElement();
try {
flvPlayer.destroy();
} catch (e) {
console.error(e);
}
this.flvPlayer = null;
}
flvPlayer = flvjs.createPlayer({
type: 'flv',
url: url,
isLive: true,
cors: true
}, {
enableWorker: true,
enableStashBuffer: false,
stashInitialSize: 1,
fixAudioTimestampGap: false
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
</script>
<script>
var hlsPlayer;
function playHls() {
if (hlsPlayer) {
hlsPlayer.destroy();
hlsPlayer = null;
}
var videoSrc = $('#hlsUrl').val();
var video = document.getElementById('video');
if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = videoSrc;
} else if (Hls.isSupported()) {
hlsPlayer = new Hls();
hlsPlayer.loadSource(videoSrc);
hlsPlayer.attachMedia(video);
}
else {
console.error('hls is not supported');
}
}
</script>
<script>
$('#playFlv').click(function () {
playFlv();
});
$('#playHls').click(function () {
playHls();
});
</script>
<script>
playFlv();
playHls();
</script>
</body>
</html>

Binary file not shown.

@ -0,0 +1,2 @@
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker compose up -d

@ -0,0 +1 @@
docker-compose down --remove-orphans
Loading…
Cancel
Save