新闻中心
如何在J*aScript中流式播放本地视频文件

本教程旨在解决在J*aScript中尝试流式播放本地视频文件时常见的`DOMException: The element has no supported sources`错误。我们将详细讲解如何正确地创建并配置HTML `
理解问题:为什么直接用字符串创建Blob会失败?
在尝试通过J*aScript播放本地视频文件时,开发者有时会遇到一个常见的误区:试图通过将文件路径字符串直接传递给Blob构造函数来创建视频Blob,例如:
var file = new Blob(["./video.mp4"], {"type": "video/mp4"});
var value = URL.createObjectURL(file);
console.log(value); // 输出一个Blob URL,例如 blob:http://localhost:8080/some-uuid
video.src = value; // 尝试播放时报错这种做法会导致Uncaught (in promise) DOMException: The element has no supported sources.错误。其根本原因在于,new Blob(["./video.mp4"], ...)创建的Blob对象,其内容是字符串"./video.mp4"的二进制表示,而不是实际的video.mp4文件的二进制数据。因此,当浏览器尝试解析这个Blob URL作为视频源时,它发现Blob内部的数据并非有效的视频格式,从而抛出错误。
URL.createObjectURL()的正确用途是为已经存在于内存中的二进制数据(如File对象、Blob对象或MediaSource对象)创建一个临时的、可访问的URL。它不负责从文件系统加载文件内容。
正确加载和播放本地视频文件
对于一个可直接通过URL访问的本地视频文件(例如,与HTML文件在同一目录下的video.mp4),最直接且有效的方法是将其路径设置为
1. 创建视频(
首先,我们需要在文档中创建一个
var videoElement = document.createElement("video");
// 可以设置一些视频属性,例如控制条、自动播放等
videoElement.controls = true; // 显示播放控制条
// videoElement.autoplay = true; // 自动播放
// videoElement.loop = true; // 循环播放2. 创建源()元素
为了指定视频文件的来源和类型,我们需要创建一个
var sourceElement = document.createElement("source");3. 设置源文件的路径和MIME类型
这是关键一步。将视频文件的相对或绝对路径赋给sourceElement的src属性,并指定正确的MIME类型(例如,对于MP4视频是video/mp4)。
sourceElement.setAttribute('src', 'video.mp4'); // 假设视频文件名为 video.mp4 且与HTML文件同级
sourceElement.setAttribute('type', 'video/mp4'); // 指定视频的MIME类型注意: 确保src属性指向的文件路径是正确的,并且视频文件的MIME类型与type属性的值匹配。不匹配的MIME类型也可能导致播放失败。
android rtsp流媒体播放介绍 中文WORD版
本文档主要讲述的是android rtsp流媒体播放介绍;实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频,的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
1
查看详情
4. 将源元素添加到视频元素,并将视频元素添加到DOM
最后,将配置好的sourceElement添加到videoElement中,然后将videoElement添加到页面的某个位置(例如document.body)。
videoElement.appendChild(sourceElement); document.body.appendChild(videoElement); // 将视频添加到文档的<body>中
完整示例代码
结合上述步骤,完整的J*aScript代码如下:
/**
* 动态创建并加载本地视频文件到HTML页面
* @param {string} videoPath 视频文件的路径 (例如: 'video.mp4' 或 '/assets/videos/my_video.mp4')
* @param {string} mimeType 视频文件的MIME类型 (例如: 'video/mp4', 'video/webm')
*/
function loadAndPlayLocalVideo(videoPath, mimeType) {
// 1. 创建 为了运行上述代码,您需要一个HTML文件,例如index.html,以及一个名为video.mp4的视频文件(或您指定的其他文件)。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>J*aScript 播放本地视频教程</title>
</head>
<body>
<h1>使用 J*aScript 动态播放本地视频</h1>
<div id="video-container">
<!-- 视频将在这里被JS代码添加 -->
</div>
<script src="your_script.js"></script> <!-- 假设上面的JS代码保存在 your_script.js -->
</body>
</html>URL.createObjectURL 的正确应用场景
虽然上述方法适用于直接通过路径访问的本地文件,但在某些情况下,URL.createObjectURL 仍然非常有用,例如:
-
用户上传的文件: 当用户通过选择文件时,您会获得一个File对象。File对象是Blob的子类型,可以直接用于URL.createObjectURL。
document.getElementById('fileInput').addEventListener('change', function(event) { var file = event.target.files[0]; // 获取用户选择的第一个文件 if (file && file.type.startsWith('video/')) { var videoURL
= URL.createObjectURL(file);
var videoElement = document.createElement("video");
videoElement.src = videoURL;
videoElement.controls = true;
document.body.appendChild(videoElement);
// 当不再需要Blob URL时,应释放它以避免内存泄漏
videoElement.onended = function() {
URL.revokeObjectURL(videoURL);
console.log("Blob URL 已释放");
};
} else {
alert('请选择一个视频文件。');
}
}); -
通过Fetch API获取的二进制数据: 当您通过fetch请求获取到视频的二进制数据(例如response.blob())时,可以创建一个Blob URL来播放它。
fetch('path/to/remote/video.mp4') .then(response => response.blob()) // 获取响应体作为Blob .then(videoBlob => { var videoURL = URL.createObjectURL(videoBlob); var videoElement = document.createElement("video"); videoElement.src = videoURL; videoElement.controls = true; document.body.appendChild(videoElement); // 同样,使用后释放URL videoElement.onended = function() { URL.revokeObjectURL(videoURL); console.log("Blob URL 已释放"); }; }) .catch(error => console.error('获取视频失败:', error));
重要提示: 使用URL.createObjectURL()创建的URL是临时的,并且只在当前文档的生命周期内有效。为了避免内存泄漏,当不再需要这些URL时,应该调用URL.revokeObjectURL()来释放它们。
总结
在J*aScript中播放本地视频文件,关键在于正确地指定视频源。对于可以直接通过路径访问的文件,应直接将路径赋值给
以上就是如何在J*aScript中流式播放本地视频文件的详细内容,更多请关注其它相关文章!
# 创建一个
# seo编辑优化教程
# 饲料营销推广方案模板
# 泌阳网络营销与推广
# 相城区网站建设服务价格
# 线上微信小区营销推广方案
# 古交响应式网站建设
# 当富广州网站建设
# 泉州精准营销推广系统
# 美容美发市场营销推广
# 郴州网站建设总结报告
# 并将
# 适用于
# 子类
# 流式
# 二进制数
# javascript
# 文档
# 流媒体
# 加载
# 视频文件
# 视频播放
# 区别
# html文件
# ai
# app
# 浏览器
# html5
# 视频教程
# js
# html
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
拼多多赚钱渠道_拼多多收益来源
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
poki网页游戏推荐_poki免费游戏平台入口
AO3中文官网链接_AO3网页版稳定镜像站
响应式图片在网页设计中的正确实现方法
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
Tailwind CSS line-clamp 布局问题解析与修复指南
汽水音乐在线解析 汽水音乐在线解析入口
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
J*aScript:在map操作中高效处理空数组
《主播少女的秘密账号迷宫》首支宣传片
Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
探索高级语言到原生C/C++的转译:挑战与内存管理策略
微博网页版首页入口 微博电脑端官网登录链接
葱吃多了会怎样 葱吃多了会伤胃吗
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
马斯克:Optimus 人形机器人复数形式为 Optimi
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
J*aScript DOM操作:高效清空列表元素的策略与实践
TikTok国际版官网直达_TikTok国际版官网直达进入在线观看
J*aScriptWebpack优化_J*aScript构建工具实战
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
抓大鹅无需下载版 抓大鹅秒玩版入口
2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
解决Python logging 中 datefmt 导致时间戳固定不变的问题
铁路12306官网网页端快速入口 铁路12306官方首页登录教程
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
淘宝网网页版登录入口 淘宝官方网页版快捷登录
AI泡沫首次被“刺破”:GPU十年都无法存活!
Angular Material 垂直步进器:实现底部到顶部排序的教程


2025-11-27
浏览次数:次
返回列表
= URL.createObjectURL(file);
var videoElement = document.createElement("video");
videoElement.src = videoURL;
videoElement.controls = true;
document.body.appendChild(videoElement);
// 当不再需要Blob URL时,应释放它以避免内存泄漏
videoElement.onended = function() {
URL.revokeObjectURL(videoURL);
console.log("Blob URL 已释放");
};
} else {
alert('请选择一个视频文件。');
}
});