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
英文地址,請注明出處:http://en.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;高效處理大量傳入連接請求是確保性能和可靠性的核心。操作系統通過維護專門的隊列機制來管…