{"id":15033585,"url":"https://github.com/eroszy/wxinlineplayer","last_synced_at":"2025-04-08T09:12:52.936Z","repository":{"id":42845984,"uuid":"200041595","full_name":"ErosZy/WXInlinePlayer","owner":"ErosZy","description":"🤟 Super fast H.264/H.265 FLV player","archived":false,"fork":false,"pushed_at":"2023-01-06T02:03:47.000Z","size":168766,"stargazers_count":1454,"open_issues_count":13,"forks_count":243,"subscribers_count":40,"default_branch":"master","last_synced_at":"2025-04-08T09:12:41.518Z","etag":null,"topics":["asm","audiocontext","canvas","decoder","flv","h264","h265","h5","player","playsinline","wasm","webgl","wechat"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ErosZy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-08-01T11:54:14.000Z","updated_at":"2025-04-07T14:24:04.000Z","dependencies_parsed_at":"2023-02-05T02:30:35.578Z","dependency_job_id":null,"html_url":"https://github.com/ErosZy/WXInlinePlayer","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ErosZy%2FWXInlinePlayer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ErosZy%2FWXInlinePlayer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ErosZy%2FWXInlinePlayer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ErosZy%2FWXInlinePlayer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ErosZy","download_url":"https://codeload.github.com/ErosZy/WXInlinePlayer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247809964,"owners_count":20999816,"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":["asm","audiocontext","canvas","decoder","flv","h264","h265","h5","player","playsinline","wasm","webgl","wechat"],"created_at":"2024-09-24T20:21:50.820Z","updated_at":"2025-04-08T09:12:52.910Z","avatar_url":"https://github.com/ErosZy.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"![LOGO](./images/logo.png)\r\n------------------\r\n[![LICENSE](https://img.shields.io/badge/license-Anti%20996-blue.svg)](https://github.com/996icu/996.ICU/blob/master/LICENSE)\r\n[![996.icu](https://img.shields.io/badge/link-996.icu-red.svg)](https://996.icu)\r\n\r\n* [简介](#%E7%AE%80%E4%BB%8B)\r\n* [特性](#%E7%89%B9%E6%80%A7)\r\n* [兼容性](#%E5%85%BC%E5%AE%B9%E6%80%A7)\r\n* [示例](#%E7%A4%BA%E4%BE%8B)\r\n* [如何编译](#%E5%A6%82%E4%BD%95%E7%BC%96%E8%AF%91)\r\n* [快速开始](#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B)\r\n* [API](#api)\r\n* [事件](#%E4%BA%8B%E4%BB%B6)\r\n* [初始化参数](#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%82%E6%95%B0)\r\n* [如何选择解码依赖](#%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E8%A7%A3%E7%A0%81%E4%BE%9D%E8%B5%96)\r\n* [如何降低卡顿和延迟](#%E5%A6%82%E4%BD%95%E9%99%8D%E4%BD%8E%E5%8D%A1%E9%A1%BF%E5%92%8C%E5%BB%B6%E8%BF%9F)\r\n* [性能比较](#%E6%80%A7%E8%83%BD%E6%AF%94%E8%BE%83)\r\n* [其他问题](#%E5%85%B6%E4%BB%96%E9%97%AE%E9%A2%98)\r\n* [项目计划](#%E9%A1%B9%E7%9B%AE%E8%AE%A1%E5%88%92)\r\n* [已知使用的产品](#%E5%B7%B2%E7%9F%A5%E4%BD%BF%E7%94%A8%E7%9A%84%E4%BA%A7%E5%93%81)\r\n* [QQ技术支持群](#qq%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81%E7%BE%A4)\r\n* [项目捐助](#%E9%A1%B9%E7%9B%AE%E6%8D%90%E8%B5%A0)\r\n\r\n## 简介\r\n\r\n随着直播和短视频的兴起，视频由于承担了更大的信息量，因此现在已经是非常主流的运营/产品信息输出方式。但由于国内各个浏览器厂商自身的利益关系所在，他们对HTML5的Video能力做了非常多的限制，不限于：\r\n1. 禁止自动播放\r\n2. 播放器魔改为原生播放器，层级最高，不可进行HTML相关元素层叠\r\n3. 播放前后硬插广告内容\r\n4. 视频自动置顶\r\n5. 相关API和事件实现不统一\r\n6. ......\r\n\r\n其具体问题可以参考腾讯IMWeb团队编写的[《复杂帧动画之移动端Video采坑实现》](https://juejin.im/post/5d513623e51d453b72147600)。\r\n\r\n为了解决这些问题，我们通过软解FLV的方式实现了WXInlinePlayer，其用的第三方技术和平台API如下：\r\n1. [OpenH264](https://github.com/cisco/openh264)/[TinyH264](https://github.com/udevbe/tinyh264)/[de265](https://github.com/strukturag/libde265)；\r\n2. [emscripten](https://github.com/emscripten-core/emscripten)\r\n3. [WebGL](https://developer.mozilla.org/zh-CN/docs/Web/API/WebGL_API)\r\n4. [Web Audio Api](https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API)\r\n\r\n同时我们也编写了WebAssembly版本的FLV Demuxer，你可以在[lib/codec](https://github.com/qiaozi-tech/WXInlinePlayer/tree/master/lib/codec)找到相关代码。\r\n\r\n## 特性\r\n\r\n1. FLV  H264/H265 点播/直播全支持\r\n2. 自由选择解码依赖，在实际gzip中，Tinyh264只需 ~180k，OpenH264 ~260k，de265 ~210k （[如何选择解码依赖](#%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E8%A7%A3%E7%A0%81%E4%BE%9D%E8%B5%96)）\r\n3. 专为移动端性能优化，内存和CPU占用稳定\r\n4. 直播延迟优化，比MSE的原生Video实现低1-2s（[如何降低卡顿和延迟](#%E5%A6%82%E4%BD%95%E9%99%8D%E4%BD%8E%E5%8D%A1%E9%A1%BF%E5%92%8C%E5%BB%B6%E8%BF%9F)）\r\n5. 音频/视频独立支持\r\n6. 微信WebView自动播放\r\n7. 无音频动画自动播放\r\n8. 良好的移动端WebView兼容性\r\n\r\n## 兼容性\r\n兼容测试使用BrowserStack服务提供的相关机型，仅供参考：\r\n* Android 5+\r\n* iOS 10+ （含Safari及WebView）\r\n* Chrome 25+\r\n* Firefox 57+\r\n* Edge 15+\r\n* Safari 10.1+\r\n\r\n## 示例\r\n\u003e https://eroszy.github.io/WXInlinePlayer/example/index.html\r\n\r\n## 如何编译\r\n\r\n请确保你安装过[parcel](https://parceljs.org/) / [emscripten 1.38.45](https://github.com/emscripten-core/emscripten) / [cmake](https://cmake.org/) 以及 [make](http://www.gnu.org/software/make/)，然后执行以下命令即可：\r\n```shell\r\nnpm install # 初始化工程\r\nnpm update # 更新工程有关的插件。如果网络错误，改用 cnpm update\r\nbash build.sh\r\n```\r\n最终产物会在example文件夹中。\r\n\r\n\u003e 请注意：\r\n\u003e * 请在*nix环境下进行build，并不保证Windows下的OpenH264的编译\r\n\u003e * 请确保emscripten在1.38.45版本，否则会出现wasm32错误\r\n\u003e * cmake 版本需要是 3.16+\r\n\r\n## 快速开始\r\n```html\r\n\u003c!DOCTYPE html\u003e\r\n\u003chtml\u003e\r\n\u003chead\u003e\r\n  \u003cmeta charset=\"UTF-8\" /\u003e\r\n  \u003ctitle\u003eWXInlinePlayer\u003c/title\u003e\r\n  \u003cstyle\u003e\r\n    * {\r\n      margin: 0;\r\n      padding: 0;\r\n    }\r\n\r\n    html,\r\n    body {\r\n      width: 100%;\r\n      height: 100%;\r\n    }\r\n  \u003c/style\u003e\r\n\u003c/head\u003e\r\n\u003cbody\u003e\r\n  \u003ccanvas id=\"container\" width=\"800\" height=\"450\"\u003e\u003c/canvas\u003e\r\n  \u003cscript src=\"./index.js\"\u003e\u003c/script\u003e\r\n  \u003cscript\u003e\r\n    if (WXInlinePlayer.isSupport()) {\r\n      WXInlinePlayer.init({\r\n        asmUrl: './prod.baseline.asm.combine.js',\r\n        wasmUrl: './prod.baseline.wasm.combine.js'\r\n      });\r\n\r\n      WXInlinePlayer.ready().then(() =\u003e {\r\n        const player = new WXInlinePlayer({\r\n          url: 'https://static.petera.cn/mm.flv',\r\n          $container: document.getElementById('container'),\r\n          hasVideo: true,\r\n          hasAudio: true,\r\n          volume: 1.0,\r\n          muted: false,\r\n          autoplay: true,\r\n          loop: true,\r\n          isLive: false,\r\n          chunkSize: 128 * 1024,\r\n          preloadTime: 5e2,\r\n          bufferingTime: 1e3,\r\n          cacheSegmentCount: 64,\r\n          customLoader: null\r\n        });\r\n\r\n        const { userAgent } = navigator;\r\n        const isWeChat = /MicroMessenger/i.test(userAgent);\r\n        if (!isWeChat) {\r\n          alert('click to play!');\r\n          document.body.addEventListener('click', () =\u003e {\r\n            player.play();\r\n          });\r\n        }\r\n      });\r\n    }\r\n  \u003c/script\u003e\r\n\u003c/body\u003e\r\n\u003c/html\u003e\r\n```\r\n\r\n在工程根目录,输入命令启动server:\r\n```shell\r\nnpm run serve\r\n```\r\n然后输入网址访问demo:\r\n```\r\nhttp://localhost:8888/example/index.html\r\n```\r\n\r\n## API\r\n\r\n### Boolean WXInlinePlayer.isSupport(void)\r\n\r\n当前执行环境是否支持WXInlinePlayer。\r\n```javascript\r\nif(WXInlinePlayer.isSupport()){\r\n  console.log('WXInlinePlayer support');\r\n}\r\n```\r\n\r\n### Promise WXInlinePlayer.init(Object)\r\n\r\n初始化WXInlinePlayer，需要传入加载的H264解码库的具体地址，关于解码库的选择，请参考：[如何选择解码依赖](#%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%E8%A7%A3%E7%A0%81%E4%BE%9D%E8%B5%96)。\r\n```javascript\r\nif(WXInlinePlayer.isSupport()){\r\n  WXInlinePlayer.init({\r\n    asmUrl: './prod.baseline.asm.combine.js',\r\n    wasmUrl: './prod.baseline.wasm.combine.js'\r\n  }).catch(e=\u003e{\r\n    console.log(`WXInlinePlayer init error: ${e}`);\r\n  });\r\n}\r\n```\r\n\r\n### Promise WXInlinePlayer.ready(void)\r\n\r\nWXInlinePlayer已经准备就绪，可以安全的进行初始化操作。\r\n\r\n```javascript\r\nif(WXInlinePlayer.isSupport()){\r\n  WXInlinePlayer.init({/*.....*/});\r\n  WXInlinePlayer.ready().then(()=\u003e{\r\n    console.log('WXInlinePlayer ready');\r\n  });\r\n}\r\n```\r\n\r\n### WXInlinePlayerInstance WXInlinePlayer(Object)\r\n\r\nWXInlinePlayer构造函数，相关初始化参数请参考：[初始化参数](#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%82%E6%95%B0)。\r\n\r\n```javascript\r\nWXInlinePlayer.ready().then(()=\u003e{\r\n  const player = new WXInlinePlayer({/*...*/});\r\n});\r\n```\r\n\r\n### void WXInlinePlayerInstance.play(void)\r\n\r\n进行视频播放。需要注意的是由于浏览器限制（不包含微信及Chrome 66版本以下），高版本已经禁用了音频自动播放，因此直接调用此方法可能并不会有作用，请在click/touchstart/touchend/touchmove等事件中让用户主动触发。\r\n\r\n```javascript\r\ndocument.body.addEventListener('click', ()=\u003e{\r\n  player.play();\r\n});\r\n```\r\n\r\n### void WXInlinePlayerInstance.stop(void)\r\n\r\n停止整个播放器，不可被恢复(resume)。\r\n\r\n```javascript\r\nplayer.stop();\r\n```\r\n\r\n### void WXInlinePlayerInstance.pause(void)\r\n\r\n暂停当前播放。\r\n\r\n```javascript\r\nplayer.pause();\r\n```\r\n\r\n### void WXInlinePlayerInstance.resume(void)\r\n\r\n恢复由pause引起的暂停操作。\r\n\r\n```javascript\r\nplayer.resume();\r\n```\r\n\r\n### Number|void WXInlinePlayerInstance.volume(Number|void)\r\n\r\n获取/设置当前音量。\r\n```javascript\r\nconst volume = player.volume(); // get volume\r\nplayer.volume(volume); // set volume\r\n```\r\n\r\n### Boolean|void WXInlinePlayerInstance.mute(Boolean|void)\r\n\r\n获取/设置静音状态。\r\n```javascript\r\nconst muted = player.mute(); // get mute\r\nplayer.mute(muted); // set mute\r\n```\r\n\r\n### void WXInlinePlayerInstance.destroy(void)\r\n\r\n销毁播放器，释放所有内存等待回收。\r\n```javascript\r\nplayer.destroy();\r\n```\r\n\r\n### Number WXInlinePlayerInstance.getCurrentTime(void)\r\n\r\n获取当前播放时间，请注意，可能出现负值的情况请注意处理。\r\n```javascript\r\nplayer.on('timeUpdate', ()=\u003e{\r\n  let currentTime = player.getCurrentTime();\r\n  currentTime = currentTime \u003c= 0 ? 0 : currentTime;\r\n});\r\n```\r\n\r\n### Number WXInlinePlayerInstance.getAvaiableDuration(void)\r\n\r\n可播放时长，可理解为缓冲的时长。\r\n```javascript\r\nplayer.on('timeUpdate', ()=\u003e{\r\n  const duration = player.getAvaiableDuration();\r\n});\r\n```\r\n\r\n## 事件\r\n\r\n* mediaInfo(Object) - 视频相关信息，例如width/height/fps/framerate等\r\n* playing(void) - 开始/正在播放\r\n* buffering(void) - 内部帧数据不足，开始缓冲\r\n* stopped(void) - 停止播放\r\n* end(void) - 播放结束\r\n* timeUpdate(currentTime:Number) - 当前播放的进度，250ms进行一次触发\r\n* loadError({status:Number, statusText:String, detail:Object}) - 加载失败\r\n* loadSuccess(void) - 加载成功\r\n* performance({averageDecodeCost:Number, averageUnitDuration:Number}) - 编码性能检测事件，averageDecodeCost代表平均的解码消耗的时长，averageUnitDuration代表在averageDecodeCost下解码得到的可播放单元时长\r\n\r\n## 如何选择解码依赖\r\n\r\n目前有3套解码库，分别是：\r\n* prod.baseline.asm.combine / prod.baseline.wasm.combine\r\n* prod.all.asm.combine / prod.all.wasm.combine\r\n* prod.h265.asm.combine / prod.h265.wasm.combine\r\n\r\n其区别在于：\r\n1. baseline文件大小更小（gzip后相比all小80k），但是只支持baseline的profile\r\n2. all的profile支持更完整（baseline/main/high），并且性能相比于baseline更好\r\n2. h265主要支持h265的flv流，此实现拓展了FLV格式，参考了金山的拓展要求，如有此需求请参考[金山的FLV拓展规范](https://github.com/ksvc/FFmpeg/wiki)\r\n\r\n我们推荐当你播放广告视频/营销视频/小动画视频等对依赖库大小敏感的时候使用baseline.asm/baseline.wasm，而在播放点播视频/直播视频时等对依赖库大小不敏感的时候使用all.asm/all.wasm。\r\n\r\n## 性能比较\r\n在开发本机上，针对同一视频，WXInlinePlayer与手淘、花椒等FFMpeg实现在内存占用和CPU占用上相差不大，WXInlinePlayer性能整体较FFMpeg方案好5-10%左右，而H265由于减少的deblock，其性能相比于FFMpeg方案好30%左右，以下为H265的播放性能对比：\r\n\r\n![性能比较](./images/benchmark.png)\r\n\r\n## 如何降低卡顿和延迟\r\n\r\nWXInlinePlayer的卡顿和延迟主要来自于3个地方：\r\n* 网络加载的延迟\r\n* 软解码的延迟\r\n* 渲染的延迟\r\n\r\n一般来说，如果在用户网络环境较好的情况下，渲染由于使用了WebGL，很难造成瓶颈（操作很单一），其中一般会因为软解码性能不足造成不停卡顿及延迟。\r\n\r\n优化因为软解码性能不足造成的延迟，我们一般从几个地方着手：\r\n1. 视频的profile：相比于main/high而言，baseline不包含B帧，解码消耗更低\r\n2. 视频帧率：过高的帧率会造成软解码跟不上，可以试着降低帧率，例如24fps\r\n3. 视频码率：码率越高，视频富含的细节越多，也越清晰，但是会消耗更多的解码性能，可以试着降低码率\r\n4. 视频分辨率：过高的视频会造成单帧传递的数量极大\r\n\r\n目前WXInlinePlayer在中高端机上解1280x720，码率1024，帧率24fps的视频比较流畅。\r\n\r\n关于以上提到的视频参数你可以通过FFmpeg查看：\r\n```shell\r\nffmpeg -i \"your.flv\"\r\n```\r\n\r\n在这里我们给出主流平台的profile/帧率/码率/分辨率供参考：\r\n\r\n平台 | 类型 | 清晰度 | profile | 帧率 | 码率 | 分辨率\r\n -|-|-|-|-|-|-\r\n虎牙|横屏|标清|High|24|500k|800x450\r\n虎牙|横屏|高清|High|24|1200k|1280x720\r\n虎牙|竖屏|高清|Main|16|1280k|540x960\r\n奇秀|竖屏|标清|High|15|307k|204x360\r\n奇秀|竖屏|高清|High|15|512k|304x540\r\n奇秀|竖屏|超清|Baseline|15|1440k|720x1280\r\n抖音|竖屏|默认|High|30|1600k（变化较多，仅供参考）|720x1280\r\n快手|竖屏|默认|High|25|2880k（变化较多，仅供参考）|720x1280\r\n\r\n我们建议你：\r\n1. 如果你想能够覆盖更多的机型，那么奇秀标清或是高清的配置适合你\r\n2. 如果你想只支持Android中高端机和iPhone6+，那么虎牙高清的配置适合你\r\n\r\nWXInlinePlayer的我们常用的低延迟配置参数如下，仅供参考，实际请根据你的直播流/点播文件配置调整：\r\n```javascript\r\n{\r\n  chunkSize: 128 * 1024,\r\n  preloadTime: 5e2,\r\n  bufferingTime: 1e3,\r\n  cacheSegmentCount: 64,\r\n}\r\n```\r\n\r\n同时，你可以使用**performance事件**来判断当前的解码性能，然后提示用户并降级到你的后备方案（例如直接video播放/静态图/序列帧等）：\r\n```javascript\r\nplayer.on('performance', ({averageDecodeCost, averageUnitDuration})=\u003e{\r\n  const prop = averageUnitDuration / averageDecodeCost;\r\n  if(prop \u003e= 2.0){\r\n    console.log('good performance');\r\n  }else if(prop \u003c 2.0 \u0026\u0026 prop \u003e= 1.0){\r\n    console.log('ok, thats fine');\r\n  }else{\r\n    console.log('bad performance');\r\n  }\r\n});\r\n```\r\n\r\n## 其他问题\r\n* *为什么不对FFmpeg精简后emscripten编译？*\r\n\r\nFFmpeg方案目前有几个比较大的问题，第一个是解码库的大小，精简后2M左右，gzip大约600k，这对于在意依赖库大小的产品是不可接受的。其次FFmpeg的方案难以被自己优化，比如WXInlinePlayer在2.0时会做多Worker的解码，这对于此类方案的修改成本是非常大的。\r\n\r\n* *为什么有些机器播放点播/直播会频繁卡顿，如何解决？*\r\n\r\n卡顿和延迟的原因比较复杂，对于WXInlinePlayer来说一般情况是解码速度跟不上播放速度，请参考[如何降低卡顿和延迟](#%E5%A6%82%E4%BD%95%E9%99%8D%E4%BD%8E%E5%8D%A1%E9%A1%BF%E5%92%8C%E5%BB%B6%E8%BF%9F)进行优化。\r\n\r\n* *为什么不对UC浏览器（iOS/Android）进行支持？*\r\n\r\nUC不管是iOS还是Android都对WebAssembly/ASM.js进行了阉割，因此索性不支持了。\r\n\r\n* *如何将现有视频文件转换成WXInlinePlayer可播放的文件？*\r\n\r\n请使用FFmpeg或是其他类似的工具，这里给出一个简单的命令示例：\r\n```shell\r\nffmpeg -i \"your.mp4\" -vcodec libx264 -acodec aac out.flv\r\n```\r\n\r\n* *如何编码H265的FLV？*\r\n\r\nWXInlinePlayer的FLV规范遵循[金山的FLV拓展规范](https://github.com/ksvc/FFmpeg/wiki)，如果需要进行相关的编码，可以参考其相关的[FFmpeg patch](https://github.com/ksvc/FFmpeg/wiki/instructions)或者[金山编写的编码器](https://github.com/ksvc/ks265codec)。\r\n\r\n## 项目计划\r\n* \u003cdel\u003eV1.1 支持HTTP-FLV及流式解码\u003c/del\u003e\r\n* \u003cdel\u003eV1.1 支持音视频独立播放\u003c/del\u003e\r\n* \u003cdel\u003eV1.2 降低直播流延迟\u003c/del\u003e\r\n* \u003cdel\u003eV1.3 增加H265支持\u003c/del\u003e\r\n* V1.4\r\n   * 增加首帧逻辑\r\n   * 重构解码器，精确缓存帧数据\r\n   * \u003cdel\u003eSharedArrayBuffer支持，减少内存占用和CPU的拷贝性能消耗\u003c/del\u003e\r\n* V1.5\r\n   * 增加poster参数\r\n   * 增加OffscreenCanvas的支持，提升性能和减少内存占用（Chrome 69+）\r\n   * 提供默认的播放器UI\r\n* V1.7 新增H265的SIMD支持\r\n* V1.8 新增H264的SIMD支持\r\n* V1.9 支持多Worker的GOP并行解码，提升软解性能\r\n* V1.10 支持FLV Seek操作\r\n\r\n## 已知使用的产品\r\n\r\n* [全民K歌](https://kg.qq.com/)\r\n* [好惠买](http://h5.haohuimai1.com/)\r\n* [兔几直播](https://www.tuji.com/)\r\n* 各个安防厂商\r\n\r\n## QQ技术支持群\r\n![QQ群](./images/qq.jpeg \"QQ群\")\r\n\r\n## 项目捐赠\r\n![微信支付](./images/wepay.png \"微信支付\")  ![支付宝](./images/alipay.png \"支付宝\")\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feroszy%2Fwxinlineplayer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feroszy%2Fwxinlineplayer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feroszy%2Fwxinlineplayer/lists"}