Cordova + Vue 移动端视频播放组件(支持 HLS + 原生播放器兜底)

在混合 App 中,移动端使用 标签播放视频经常踩坑,尤其是格式兼容、跨域限制、WebView 差异等问题。
本文介绍一个通用的 Cordova 视频播放组件:优先 HTML5 播放,播放失败自动提示用户使用系统播放器,并支持原生插件兜底播放。
✅ 功能亮点

  • ✅ 支持 MP4 / M3U8(HLS.js)
  • ✅ 播放失败提示「点击使用系统播放器」
  • ✅ 原生播放器兜底(cordova-plugin-streaming-media)
  • ✅ 可配置横/竖屏、全屏、缓存下载
  • ✅ 使用简单,移动端稳定运行

🧩 安装依赖

cordova plugin add cordova-plugin-streaming-media
npm install hls.js

🧱 组件源码(CordovaVideo.vue)

<template><div class="video-wrapper" v-show="visible" @click="onMaskClick"><videov-if="!useNativePlayer"ref="video"class="video-player":src="videoSrc"controlsplaysinlinewebkit-playsinline:poster="poster"@click.stop@error="onVideoError"@waiting="$emit('buffering')"@playing="$emit('playing')"></video><div v-if="fallbackPrompt" class="fallback-tip" @click.stop><p>播放失败,点击使用系统播放器</p><button @click="useSystemPlayer">用系统播放器播放</button></div><button class="close-btn" @click.stop="onMaskClick" aria-label="关闭视频">×</button><div v-if="downloading" class="download-progress" @click.stop><p>缓存中 {{ Math.round(progress * 100) }}%</p></div></div>
</template><script>
import Hls from 'hls.js'export default {name: 'CordovaVideo',props: {src: { type: String, required: true },cache: { type: Boolean, default: false },poster: String,landscape: { type: Boolean, default: true }},data () {return {visible: false,localPath: null,downloading: false,progress: 0,hls: null,useNativePlayer: false,fallbackPrompt: false}},computed: {videoSrc () {if (this.isM3U8) return ''return this.localPath || this.src},isM3U8 () {return this.src.endsWith('.m3u8')}},mounted () { this.prepare() },methods: {cleanupHtml5 () {if (this.hls) { this.hls.destroy(); this.hls = null }const v = this.$refs.videoif (v) { v.pause(); v.removeAttribute('src'); v.load() }},play () {if (this.visible) returnthis.visible = truethis.useNativePlayer = falsethis.fallbackPrompt = falsethis.$nextTick(() => {if (this.isM3U8 && Hls.isSupported()) {this.initHls()} else {this.tryHtml5Play()}})},tryHtml5Play () {const v = this.$refs.videoif (!v) return this.showFallback()const onSuccess = () => {v.removeEventListener('error', onError)clearTimeout(timer)}const onError = () => this.showFallback()v.addEventListener('error', onError, { once: true })v.addEventListener('playing', onSuccess, { once: true })v.play().catch(() => this.showFallback())const timer = setTimeout(() => this.showFallback(), 5000)},showFallback () {this.fallbackPrompt = true},useSystemPlayer () {this.fallbackPrompt = falsethis.playNative()},initHls () {this.hls?.destroy()this.hls = new Hls()this.hls.attachMedia(this.$refs.video)this.hls.loadSource(this.src)this.hls.on(Hls.Events.ERROR, () => this.showFallback())},onVideoError () {this.showFallback()},playNative () {const streaming = window.plugins?.streamingMediaif (!streaming) {this.visible = falsereturn}this.cleanupHtml5()this.useNativePlayer = truethis.visible = falsestreaming.playVideo(this.src, {orientation: this.landscape ? 'landscape' : 'portrait',shouldAutoClose: true,controls: true,initFullscreen: true})},prepare () {},download () {}},watch: {src () {this.localPath = nullthis.prepare()}}
}
</script><style scoped>
.video-wrapper {position: fixed; inset: 0;background: #000;z-index: 9999;display: flex; align-items: center; justify-content: center;
}
.video-player {width: 100%; max-height: 100%;
}
.fallback-tip {position: absolute; inset: 0;background: rgba(0,0,0,0.6);color: #fff; font-size: 16px;display: flex; flex-direction: column;align-items: center; justify-content: center;
}
.fallback-tip button {padding: 6px 12px;background: #409eff; color: #fff;border: none; border-radius: 4px;
}
.close-btn {position: absolute; top: 12px; right: 12px;width: 32px; height: 32px;background: rgba(255,255,255,0.15);color: white; font-size: 20px;border: none; border-radius: 50%;cursor: pointer;
}
</style>

🔍 插件对比:Cordova 常用视频播放方案分析

插件名是否全屏是否支持横竖屏控件控制兼容性是否可自定义关闭播放格式支持综合推荐
<video> 标签否(受限)易出错(Android 上格式限制多)MP4(部分编码)、HLS(需搭配 hls.js)✅ 前置尝试
cordova-plugin-streaming-media✅ 是✅ 是✅ 支持稳定❌ 无关闭按钮(需播放结束自动退出)MP4 / M3U8 / AVI / 多格式(依赖系统播放器)⭐ 推荐兜底方案
cordova-plugin-video-player✅ 是❌ 仅竖屏❌ 控制弱支持好❌ 无退出按钮MP4 主流支持🚫 不推荐
第三方播放器 WebView 方案(如腾讯视频 iframe)❓ 取决于 Web 容器❌ 受限❓ 不统一风险高,易失效限平台❌ 仅作补充

✅ 建议组合方案

播放顺序使用方式
✅ 首选 HTML5 <video> 播放(支持 HLS 的话配合 hls.js
⚠️ 监听 play() 失败 或 error 回调中主动 fallback
🔁 兜底切换为 cordova-plugin-streaming-media 原生播放,自动退出

📦 总结

  • 移动端视频播放兼容性较差,需考虑降级处理
  • 使用原生播放器插件做兜底,是当前 Cordova 应用中可靠的解决方案
  • 推荐使用 cordova-plugin-streaming-media,轻量稳定

如果你觉得有帮助,欢迎点赞收藏支持 👍

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

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

相关文章

【Linux】掌握vim编译器使用——详细教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Vim的三种核心模式解析 二、高效编辑核心命令大全 1. 光标快速导航 2. 文本编辑四连击 3. 高效搜索替换 三、Vim神技&#xff1a;批量注释与多文件编辑 1. 批量…

Oracle迁移瀚高,如何做表等对象与文件名一对一的文件脚本(APP)

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文档用途 Oracle迁移到瀚高后&#xff0c;需要整理一张表对应一个与表同名的脚本&#xff0c;一个函数对应一个与函数同名的脚本 详细信息 一、整理…

洞察分享 | 在万物互联的时代,如何强化网络安全,更有效地保护工业基础设施?

2025年&#xff0c;物联网&#xff08;IoT&#xff09;与互联系统已深度融入工业4.0的发展之中&#xff0c;同时也带来了前所未有的网络安全挑战。随着工业系统的互联互通不断加深&#xff0c;网络攻击的范围和类型不断增加&#xff0c;关键基础设施因此面临更高的网络风险暴露…

k8s 1.23.6版本apiserver list-watch原理机制

Kubernetes 1.23.6 版本中&#xff0c;API Server 的 **List-Watch 机制** 是集群状态同步的核心机制&#xff0c;其设计目标是高效、实时地将资源变更通知到各组件&#xff08;如 kubelet、controller-manager等&#xff09;。以下是其详细原理和工作机制&#xff1a; 1. 核心…

Linux基本指令篇 —— mkdir指令

mkdir是Linux和Unix-like系统中用于创建目录的基本命令&#xff0c;全称为"make directory"。下面将详细介绍这个命令的用法、选项和实际应用。 目录 一、基本语法 二、基本用法 创建单个目录 创建多个目录 三、常用选项 -p 或 --parents -m 或 --mode -v 或 …

聊聊GPIO 工作模式

嵌入式开发中&#xff0c;GPIO&#xff08;General-Purpose Input/Output&#xff09;是最基础也最常用的功能模块之一。你可以把它想象成微控制器伸出来的无数根“手脚”&#xff1a;既可以用它输出信号去点亮LED、驱动外设&#xff0c;也可以用它输入信号来检测按键、读取传感…

DM9000AE+STM32H7在rt-thread中的使用

概述 记录下DM9000AE在rt-thread上的使用 FMC的配置 rt-thread的网络设备驱动注册 硬件连接 16bit总线 挂在FMC_A0 地址0x6000_0000 FMC的配置 FMC是STM32H7的一个外设&#xff0c;通过FMC把DM9000当做一个SRAM来访问&#xff0c;只需要配置好FCM的时序就可以了。 DM9000…

TiDB 字符串行转列与 JSON 数据查询优化知识笔记

一、长字符串行转列方案 JSON_TABLE 方案&#xff08;TiDB 5.0 推荐&#xff09; 通过将逗号分隔字符串转为 JSON 数组后展开为行&#xff1a; sql SET str ‘a,b,c,d’; SELECT jt.val, jt.pos FROM JSON_TABLE( CONCAT(‘[’, REPLACE(str, ‘,’, ‘“,”’), ‘"]’…

1 Studying《Performance Analysis and Tuning on Modern CPUs》7-11

目录 Part2. Source Code Tuning For CPU 数据驱动优化 7 CPU Front-End Optimizations 7.1 Machine code layout //机器码布局 7.2 Basic Block 7.3 Basic block placement 7.4 Basic block alignment 7.5 Function splitting //函数拆分 7.6 Function groupin…

WinUI3入门6:子线程处理UI 窗口加载后执行 获取和设置控件尺寸 自动生成事件代码框架

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

中国招聘智能化白皮书:从 “人撑不住“ 到 “AI 破局“ 的底层逻辑革命——AI得贤招聘官第六代AI面试官

一场面试&#xff0c;牵动一家公司的人力系统。 当简历数量以千计堆叠、当HR通宵挑灯刷筛选、当面试质量与效率陷入两难&#xff0c;招聘不再只是流程问题&#xff0c;而成了“组织生存”的关键变量。 问题是&#xff1a;靠人&#xff0c;已经撑不住了。 企业招聘正步入前所…

防爆型激光测距传感器:危险环境中的安全守护者

在石油化工、煤矿开采、核电站等高危工业场景中&#xff0c;爆炸性气体与粉尘的存在让传统测量设备望而却步。而防爆型激光测距传感器的出现&#xff0c;犹如为这些领域注入了一剂“安全强心针”&#xff0c;以毫米级精度与防爆双重保障&#xff0c;重新定义了工业测量的安全边…

【AI编程】PC的一个提示词,生成网站首页,模型gpt4.1 、deepseekv3和claude3.7对比,你更喜欢哪个?

AI提示词&#xff1a; 角色 你是一位资深的前端工程师、设计师和插画师 设计风格 优雅的极简主义美学与功能的完美平衡; 清新柔和的渐变配色与品牌色系浑然一体; 恰到好处的留白设计; 轻盈通透的沉浸式体验; 信息层级通过微妙的阴影过渡与模块化卡片布局清晰呈现; 按钮添加…

跟着AI学习C# Day12

&#x1f4c5; Day 12&#xff1a;LINQ&#xff08;Language Integrated Query&#xff09;基础 ✅ 目标&#xff1a; 理解 LINQ 的基本概念和作用&#xff1b;掌握使用 LINQ 查询集合&#xff08;如 List<T>、Array&#xff09;&#xff1b;学会使用常用 LINQ 方法&am…

ubuntu网络管理五花八门netplan 、NetworkManager、systemd、networking是什么关系

文章目录 **1. Netplan&#xff08;网络配置抽象层&#xff09;****2. NetworkManager&#xff08;动态网络管理&#xff09;****3. systemd-networkd&#xff08;轻量级网络管理&#xff09;****4. networking&#xff08;传统的 ifupdown&#xff09;****5. 它们之间的关系**…

Python爬虫实战:研究Twisted框架相关技术

1. 引言 1.1 研究背景与意义 随着互联网信息的爆炸式增长,网络爬虫作为一种高效获取和收集网络信息的技术手段,在搜索引擎优化、市场调研、数据挖掘等领域有着广泛的应用。传统的同步爬虫在面对大量 URL 请求时,由于 I/O 操作的阻塞特性,效率低下,难以满足实际应用需求。…

内网运行控制四百来个海康威视硬件物联网定员管控软件(华为平板电脑版)

内网运行控制四百来个海康威视硬件物联网定员管控软件&#xff08;华为平板电脑版&#xff09; 从去年12月至今&#xff0c;自研一套在内网中的华为平板电脑上运行&#xff0c;控制四百来个海康威视硬件的物联网定员管控软件&#xff0c;开始上线投入运行。 运行环境为华为平板…

C++ 面向对象特性详解:继承机制

&#x1f680; C 面向对象特性详解&#xff1a;继承机制全解析——代码复用与扩展的核心&#xff08;含实战陷阱&#xff09; &#x1f4c5; 更新时间&#xff1a;2025年6月19日 &#x1f3f7;️ 标签&#xff1a;C | 继承 | OOP | 面向对象 | 代码复用 | C基础 文章目录 &…

学习日记-day33-6.19

知识点&#xff1a; 1.Spring课程概述 知识点 核心内容 重点 Spring框架概述 轻量级容器框架&#xff0c;封装复杂逻辑&#xff0c;需理解IOC、AOP等核心机制 容器框架 vs 普通框架、封装带来的理解门槛 学习难点 动态代理、反射、注解、IO操作、XML解析、容器&#xf…

网络编程中操作系统连接队列管理:Linux TCP队列深度解析

在现代网络编程中&#xff0c;操作系统内核扮演着至关重要的角色&#xff0c;负责管理网络通信的复杂细节&#xff0c;从而为应用程序提供抽象接口。对于服务器应用程序而言&#xff0c;高效处理大量传入连接请求是确保性能和可靠性的核心。操作系统通过维护专门的队列机制来管…