Git Product home page Git Product logo

wsplayer's Introduction

Logo wsPlayer

​ wsPlayer是一款专注于WebSocket-fmp4协议的web视频播放器,HTTP/WebSocket-fmp4协议与RTMP、HLS、HTTP-FLV相比,具有播放延时短,HTML5兼容性好等优点;

见各流媒体协议对比:

协议名称 网络传输协议 延时 编码类型 HTML5支持情况
RTSP TCP/UDP/组播 0~3s H264/H265 不支持,(RTSP over HTTP除外)
RTMP TCP 0~3s H264/H265(CodecID =12) 不支持
HLS HTTP短连接 1~10s H264/H265 video标签支持
HTTP-FLV HTTP长连接 0~3s H264/H265(CodecID =12) flv → fmp4 → video标签
HTTP-fmp4 HTTP长连接 0~3s H264/H265 video标签原生支持
WebSocket-FLV WebSocket 0~3s H264/H265(CodecID =12) flv → fmp4 → video标签
WebSocket-fmp4 WebSocket 0~3s H264/H265 使用MSE,vidoe标签播放

备注:浏览器对单个页面的HTTP长连接的并发数限制为6个,这意味着HTTP-FLV、HTTP-fmp4只能同时播放6个视频画面;但浏览器对WebSocket的连接数没有限制;

项目依赖

需要使用mp4box.js来解析fmp4 moov中的codecs;

快速开始

推荐使用ZLMediaKit作为WebSocket-fmp4协议的后端流媒体服务器

  1. 部署后端流媒体服务器
docker pull panjjo/zlmediakit
docker run -id -p 8080:80 -p 554:554 panjjo/zlmediakit
  1. 使用ffmpeg命令,向ZLMediaKit添加一路RTSP推流
ffmpeg -re -stream_loop -1 -i test.mp4 -an -vcodec copy -f rtsp -rtsp_transport tcp rtsp://100.100.154.29/live/test
  1. 根据ZLMediaKit的播放url规则得知,WebSocket-fmp4协议的URL格式为:
ws://100.100.154.29:8080/live/test.live.mp4
  1. 然后调用播放器代码:
<html>
<head>
</head>
<body>
    <script type="text/javascript" src="mp4box.all.min.js"></script>
    <script type="text/javascript" src="wsPlayer.js"></script>
    <video muted autoplay id="video"></video>
    <script>
        document.addEventListener('DOMContentLoaded', function () {
            var player = new wsPlayer("video", "ws://100.100.154.29:8083/live/test.live.mp4");
            player.open();
        });
    </script>
</body>
</html>

5. magic-videoplayer

原本打算起名wsplayer,但是wsplayer的项目名称在npm公共仓库中已经被使用,顾起名magic-videoplayer magic-videoplayer 基于 react 开发,支持主流的播放器功能 以及主流的视频格式和功能 以及判别视频文件属于哪类视频格式,支持多个播放器同步播放时间校正 #使用

#项目里使用

npm i magic-videoplayer --save
或
yarn add magic-videoplayer

Player 播放器

视频播放器

代码演示

import React, { useEffect, useState } from 'react';
import { Player } from 'magic-videoplayer';

const Play = () => {
  const [url, setUrl] = useState('');
  const [ref, setRef] = useState('');
  const [wsUrl, setWsUrl] = useState('');
  const [width, setWidth] = useState(700);

  return (
    <div>
      <div style={{ width }}>
        <Player
          url={url}
          onRef={(s) => {
            setRef(s);
          }}
          extra={<div style={{ color: '#fff', lineHeight: '30px' }}>额外按钮</div>}
          onPtzChange={(ptz) => {
            console.log(ptz, 'ptzchange');
          }}
          onError={() => {
            console.log('错误onerr');
          }}
          reconnection
          onPlay={(w, h, type) => {
            console.log({ w, h, type });
          }}
          emptyurlPrompt="请选择摄像头"
          onFullChange={(full) => {
            console.log(full);
          }}
        ></Player>
      </div>
    </div>
  );
};

export default () => <Play />;

API

参数 说明 类型 默认值
url 视频地址 直播为 ws 开头 片段为 http 开头 string -
onError 播放错误时的回调 ()=>void -
onPlay 直播流开始播放的回调 (videoWidth: number, videoHeight: number,videoType:string) => void -
autoPlay 直播流是否自动播放 boolean true
reconnection 是否开启断线重连 boolean false
onRef 组件的 ref 引用 (ref:any)=>void -
extra 控制台额外的标签 ReactNode | (() => ReactNode) -
videoClass video 暴露 class string -
canvasClass canvas 暴露 class string -
screenshot 是否显示截图按钮 boolean false
closeControlBar 关闭底部控制栏(仅在直播流有效) boolean false
banfullscreen 禁止播放器全屏(仅在直播流有效) boolean false
emptyurlPrompt 播放地址为空时的提示内容 string -

播放器原理

​ 将WebSocket收到的fmp4 Segment片段appendBufferMediaSource中,此时video.buffered会记录当前已经appendBuffer的视频时间段,然后将video.buffered的起始时间设置给video.currentTime,然后浏览器就会从video.buffered缓存的视频开始播放

项目计划

  • v1.0 实现用video标签,调用MSE播放WebSocket-fmp4(H.264)直播流,并把播放器封装为标准的npm组件;
  • v2.0 实现用WebAssembly FFmpeg解码H.265,然后用canvas标签WebGL渲染YUV,从而实现播放WebSocket-fmp4(H.265)直播流,并实现动态切换H.264、H.265这两种播放机制;
  • v3.0 实现视频流SEI信息的callback回调

联系方式

  • QQ交流群:群名称:wsPlayer 群号:710185138

wsplayer's People

Contributors

tokamakz avatar xiaobingan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wsplayer's Issues

播放时间越长,wsPlayer播放延时越大

example

问题的现象:vlc和wsPlayer都从ZLM拉流播放,播放一段时间后,vlc播放的画面无延迟,但wsPlayer播放延迟变大,并且随着播放时间越长,延迟也会变大

使用的ws链接中包含有音频数据,会提示错误

使用[ZLMediaKit]推出来的ws链接,用wsPlayer播放的时候出现Uncaught DOMException: Failed to execute 'addSourceBuffer' on 'MediaSource': The type provided ('video/mp4; codecs="avc1.4d4028, alaw"') is unsupported错误提示,后来我把音频给禁了,就能正常显示
H0UD9{6F7KV4~_$34HW@0

首次播放时,video.currentTime和video.buffered.start(0)一直是0,导致播放画面出不来

根据播放器原理,播放器是根据设置video.currentTime来实现播放的,但是播放器首次拉流时,收到的视频流appendBuffervideo.buffered的起始时间一直为0,导致无法设置video.currentTime,所以视频画面出不来。

但是后续再重新播放时,就正常了。

后端流媒体服务器采用的ZLMediaKit

问题复现步骤:
ZLMediaKit addStreamProxy 新添加一路视频,然后wsPlayer马上开始播放

搭配zlm播放ws+fmp4感觉有点卡顿

zlm出来的同一路流
1 ffplay播放 http+fmp4 看起来流畅,至少视频画面的秒数是一秒一秒的显示
2 wsPlayer.js播放感觉有卡顿,观察画面的是时间戳看到画面有跳秒,比如从15s到了17s,很容易观察到,并且一致持续
前端js代码我大概看了一下,发现是不是在onupdateend函数处理有一些问题?
3 因为视频源是我推给zlm的,也不排除是我的时间戳设置存在问题,但对比ffplay来看,wsPlayer.js表现没有ffplay好。

大佬有空指导一下么,js我不太会玩转?随时可提供在线环境调试js

咨询H265播放技术

我在用 zlm 推流,目前 H265 的解码播不出来,

  1. 用 websocket TS 流 播放 ws://:880/live/test.live.ts 是黑屏 ,用 http://:880/live/test.live.ts 在 vlc 里可以播放 (H265)
  2. 用 fmp4 的 url 播放 ws://192.168.5.43:880/live/v172.16.110.19-554-1-main.live.mp4 也是黑屏( H264的可以)

请问咱们这个库升级到 H265 版本了嘛,盼回,

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.