{"id":27118442,"url":"https://github.com/suconghou/u2web","last_synced_at":"2025-07-18T04:36:23.662Z","repository":{"id":44849130,"uuid":"279066788","full_name":"suconghou/u2web","owner":"suconghou","description":"stream video with p2p","archived":false,"fork":false,"pushed_at":"2021-12-05T08:25:36.000Z","size":750,"stargazers_count":109,"open_issues_count":0,"forks_count":28,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-03T16:44:08.617Z","etag":null,"topics":["dash","datachannel","mse","p2p","player","streaming","video","video-player","video-streaming","vue","webrtc","websocket"],"latest_commit_sha":null,"homepage":"https://u2web.pages.dev/","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/suconghou.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-12T13:09:11.000Z","updated_at":"2025-04-06T00:14:47.000Z","dependencies_parsed_at":"2022-09-01T19:03:16.533Z","dependency_job_id":null,"html_url":"https://github.com/suconghou/u2web","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/suconghou/u2web","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fu2web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fu2web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fu2web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fu2web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/suconghou","download_url":"https://codeload.github.com/suconghou/u2web/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suconghou%2Fu2web/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265701126,"owners_count":23813751,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dash","datachannel","mse","p2p","player","streaming","video","video-player","video-streaming","vue","webrtc","websocket"],"created_at":"2025-04-07T07:58:01.974Z","updated_at":"2025-07-18T04:36:23.637Z","avatar_url":"https://github.com/suconghou.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# u2web\n\n支持多源多线程下载的P2P视频分享\n\n\u003e 支持多线程下载\n\u003e \n\u003e 支持多源下载\n\u003e \n\u003e CDN缓存友好,全部接口均可长缓存\n\n下载引擎/播放引擎 https://github.com/suconghou/fastloadjs\n\nDEMO https://u2web.pages.dev/\n\n## P2P说明\n\nP2P 分享使用的信令服务器 https://github.com/suconghou/signalserver\n\nP2P 分享使用的网络库 https://github.com/suconghou/rtc\n\n\nP2P分享当在线客户端播放的是同一资源(Chrome,Firefox播放的是webm,Safari播放的是mp4),同一清晰度时才会相互分享.\n\n## 网站里的设置说明\n\n这些设置一般无需更改,如播放卡顿,可修改视频解析服务\n\n**内容API服务**\n\n资源提供接口,调用有次数限制,一般使用默认值无需修改\n\n可用的后端项目 \n\nhttps://github.com/suconghou/videoproxy\n\nhttps://github.com/suconghou/u2proxyapi\n\n\n\n\n**视频解析服务**\n\n可用的后端项目\n\nhttps://github.com/suconghou/videoproxy\n\n使用cf workers 中转的 https://github.com/suconghou/u2worker\n\n使用netlify functions 中转的 https://github.com/suconghou/netlifyworker\n\n如果要使用多源负载均衡,可以使用多个地址,用`;`号隔开\n\n例如\n\n`/video;https://stream.pull.workers.dev/video`\n\n代表当前域名的和部署在`cf workers`的两个地址负载均衡\n\n注意第一个地址始终占有更高的权重,地址不可用后将会重试到其他地址.\n\n\n\n**信令服务器**\n\n一般无需修改\n\n可用的后端项目\n\nhttps://github.com/suconghou/signalserver\n\n同一信令服务器下的用户才会相互分享\n\n## 编译发布\n\n注意修改 `public/index.html` `public/play.html` 中js库的版本号\n\n然后执行 `make release`\n\n## 组件模式\n\n编译为组件模式\n\n1. 修改`service/index.js`中abs变量为https绝对地址\n2. 执行 `yarn buildwc`\n\n参数\n```\nv: {\n    type: String,\n    required: true\n},\nlevel : {\n    type:Number,\n    default:0,\n},\nautoplay: {\n    type: Boolean,\n    default: true\n},\naudio: {\n    type: Boolean,\n    default: false\n},\nplaylist: {\n    type: [String, Array],\n    default: \"\"\n}\nnop2p: {\n    type: Boolean,\n    default: false,\n},\nscreenshot: {\n    type: Boolean,\n    default: true,\n},\n\n```\n\n作为`web component`组件,所有参数默认均为零值,需自己按需设置值\n\n`level` 可配置 `1` `2` `3` 对应不同权限的清晰度\n\n`playlist`仅在`audio`模式下可用,\n\n可取值为一个播放列表ID,或者一个数组形式为\n\n```\n[\n    {\n        v:'视频ID',\n        title:'名称'\n    }\n]\n```\n\n`audio`模式需开启`autoplay`\n\n`screenshot`截图默认开启,播放器聚焦时快捷键`s`可直接触发\n\n`safari`不支持对`mse`的视频截图,已对其屏蔽,见`https://github.com/video-dev/hls.js/issues/1806`\n\n因需要`MSE`的支持,移动端手机`IOS`系统(IOS13,14等)均不支持,`iPadOS 13+`支持\n\u003e\n\u003e https://stackoverflow.com/questions/52999825/why-exactly-doesnt-html5-media-source-video-work-on-ios\n\n安卓微信支持,UC浏览器支持,手机QQ浏览器不支持.\n\n\n## embed video\n\nclick `嵌入视频` below the video player , It shows you how to embed iframe or component\n\nwhen use `web component`, it needs some dependencies `vue` `axios` `fastloadjs` `u2-player`\n\na simple example \n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n    \u003cstyle\u003e\n        /* only for css reset */\n        html{width:100%;height:100%;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased}body{margin:0;width:100%;height:100%;}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=\"checkbox\"],input[type=\"radio\"]{box-sizing:border-box;padding:0}input[type=\"number\"]::-webkit-inner-spin-button,input[type=\"number\"]::-webkit-outer-spin-button{height:auto}input[type=\"search\"]{-webkit-appearance:textfield;box-sizing:content-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}\n        input,button,select,textarea{outline:none}textarea{resize:none}a{text-decoration:none;color:#000}ul{padding-left:0;list-style:none;}\n        /* css reset end */\n        .wrapper {\n            width: 70%;\n            margin: 10px auto;\n            background: #faa;\n        }\n        .player-box {\n            height: 0;\n            padding-bottom: 59%;\n            /* 最小56.25%, 稍微加大可留一些间距,看灰色底  */\n            background: #aaa; /* this is only for debug view  */\n        }\n        .unsupport {\n            text-align: center;\n            padding-top: 100px;\n            font-size: 16px;\n            color: #f11;\n        }\n    \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003cscript\u003e\n        // please set localStorage to use your own worker or videoproxy\n        // localStorage.setItem(\"baseurl\",\"https://your_worker_or_videoproxy_domain/video\");\n    \u003c/script\u003e\n    \u003cscript src=\"https://cdn.jsdelivr.net/combine/npm/vue@2.6.11/dist/vue.min.js,npm/axios@0.19.2/dist/axios.min.js,gh/suconghou/assets@8a64290/fastload.min.js,gh/suconghou/assets@8a64290/u2-player.min.js\"\u003e\u003c/script\u003e\n    \u003cdiv class=\"wrapper\"\u003e\n        \u003cdiv class=\"player-box\"\u003e\n            \u003cu2-player autoplay=\"true\" nop2p=\"true\" screenshot=\"true\" v=\"9-4aWqk7b0k\" id=\"video\"\u003e\u003c/u2-player\u003e\n        \u003c/div\u003e\n    \u003c/div\u003e\n    \u003cscript\u003e\n        // optional , give message if browser too low\n        var modern = window.Promise \u0026\u0026\n            window.ReadableStream \u0026\u0026\n            window.fetch \u0026\u0026\n            window.ArrayBuffer \u0026\u0026\n            window.MediaSource;\n\n        if (!modern) {\n            var el = document.getElementsByClassName('player-box')\n            if (el \u0026\u0026 el.length) {\n                el[0].innerHTML = '\u003cdiv class=\"unsupport\"\u003e此浏览器不支持,请更换浏览器\u003c/div\u003e'\n            }\n        }\n    \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n**notice**\n\nyou should change `service/index.js` and `yarn buildwc` to use your own worker or videoproxy backend\n\nor set localStorage on your website\n\n**build from source**\n\nupdate `public/index.html`, modify the script `fastload.min.js` to the latest version if you need.\n\ndefault config is in `src/service/index.js` but can be override by localStorage,\nupdate it as you need.\n\n`yarn install` and `yarn build` to build website, `yarn buildwc` to build web component\n\n\n\n本项目仅作为学习使用,切勿用作其他用途\n\n更多说明可参考\n\nhttps://blog.suconghou.cn/post/mse-p2p-player/","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuconghou%2Fu2web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuconghou%2Fu2web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuconghou%2Fu2web/lists"}