MP4 与Fragmented MP4 (fMP4)的区别

区别

类别MP4FMP4(Fragmented MP4)
存储结构视频文件整体存储为一个连续文件,moov 元数据通常在文件末尾视频分成多个片段,每个片段包含独立的元数据(分片)
播放需求必须先下载 moov 元数据后才能播放可边下载边播放,适合流媒体播放
适用场景适合本地播放或完整文件下载后播放流媒体播放,例如 DASH、HLS 或通过 MediaSource API 进行播放
文件扩展名.mp4.mp4(文件扩展名相同,但内部结构不同)
实时性需要等待整个文件可用才能开始播放可实时播放,支持按需分段加载
服务器支持可用普通文件服务器提供需要支持流媒体的分段传输,例如支持 DASH 或 HLS 的 .m4s 分片

快速将 MP4 转换为 fMP4的前端库

MP4Box.js-允许操作和分片 MP4 文件

  1. 支持解析和操作 MP4 文件。
  2. 可以将普通 MP4 转换为 fMP4。
  3. 支持按需加载视频片段。

GitHub - gpac/mp4box.js: JavaScript version of GPAC's MP4Box tool

<video controls></video>
<script src="mp4box.all.js"></script>
<script>var video = document.querySelector('video');var mediaSource = new MediaSource();video.src = URL.createObjectURL(mediaSource);mediaSource.addEventListener('sourceopen', function () {var sourceBuffer = mediaSource.addSourceBuffer('video/mp4; codecs="avc1.42E01E, mp4a.40.2"');// 加载普通 MP4 并使用 MP4Box.js 转换为 fMP4fetch('video.mp4').then((response) => response.arrayBuffer()).then((buffer) => {var mp4box = MP4Box.createFile();mp4box.onReady = function (info) {console.log('MP4 文件信息:', info);};buffer.fileStart = 0;mp4box.appendBuffer(buffer);var fMP4Buffer = mp4box.flush(); // 转换为 fMP4 格式sourceBuffer.addEventListener('updateend', () => {mediaSource.endOfStream();video.play();});sourceBuffer.appendBuffer(fMP4Buffer);});});
</script>

hls.js-支持 HLS 流媒体播放和普通 MP4 转换为 fMP4 格式的库

  1. 动态加载 HLS 流时自动使用 fMP4 分片。
  2. 不需要手动转换文件
<video id="video" controls></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>if (Hls.isSupported()) {var video = document.getElementById('video');var hls = new Hls();hls.loadSource('output.m3u8'); // HLS 索引文件的 URLhls.attachMedia(video);hls.on(Hls.Events.MANIFEST_PARSED, function () {video.play();});}
</script>

Shaka Player-动态加载和转换 MP4 文件为 fMP4 格式,特别是用于 DASH 流。

GitHub - shaka-project/shaka-player: JavaScript player library / DASH & HLS client / MSE-EME player

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

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

相关文章

Ubuntu桌面管理环境: GDM3,KDM,LightDM

介绍 Ubuntu是一个广受欢迎的Linux操作系统&#xff0c;拥有强大而多样化的桌面管理环境。其中三个常用的桌面管理环境是GDM3&#xff0c;KDM和LightDM。本篇博客将介绍这三个桌面管理环境的特点和功能。 GDM3 (GNOME Display Manager) GDM3是默认的桌面管理环境&#xff0c…

VSCode快捷键Ctrl+/是注释;Ctrl+\是拆分编辑器;Ctrl+w是关闭编辑器

VSCode快捷键Ctrl/是注释&#xff1b;Ctrl\是拆分编辑器&#xff1b;Ctrlw是关闭编辑器 Ctrl/是注释&#xff0c;但是如果没弄对&#xff0c;有可能会按成Ctrl\ ,而这个快捷键是拆分编辑器&#xff0c;尤其是多按几个&#xff0c;就拆分出很多窗口&#xff0c;非常影响编程工作…

CSS:背景样式、盒子模型与文本样式

背景样式 背景样式用于设置网页元素的背景&#xff0c;包括颜色、图片等。 背景颜色 使用 background-color 属性设置背景颜色&#xff0c;支持多种格式&#xff08;颜色英文、十六进制、RGB等&#xff09;。 div {background-color: lightblue; }格式示例十六进制#ff5733R…

【Linux】记录一下考RHCE的学习过程(七)

年底了&#xff0c;公司接的北京地铁轨道交通的项目做不完了&#xff0c;一百多列地铁的设备都得调&#xff0c;派我出差了几周&#xff0c;这几天才回来&#xff0c;出差累死了实在是没办法更新。&#xff08;YOASOBI的二开票还没抢到ToT&#xff0c;哭死&#xff0c;看看回滚…

get和post有什么区别

GET和POST是HTTP协议中两种常用的请求方法&#xff0c;它们在用途、参数传递方式、缓存处理、安全性等方面存在显著差异。 以下是对GET和POST区别的详细讲解&#xff0c;并给出示例演示。 一、GET和POST的区别 用途 GET&#xff1a;主要用于获取信息&#xff0c;即进行查询操…

Lua协同程序(线程)

1、 Lua 的协同程序&#xff08;coroutine&#xff09;简单介绍 Lua 的协同程序&#xff08;coroutine&#xff09;是一种轻量级的线程&#xff0c;允许你在多个任务之间进行协作式多任务处理。与操作系统线程不同&#xff0c;协同程序是由程序员显式控制的&#xff0c;不会自动…

流媒体学习

流媒体 特性流媒体流协议FLVMSE定义采用数据流方式在网络上进行播放的媒体格式用于传输流媒体数据的网络协议Flash Video&#xff0c;一种流媒体格式一项 W3C 规范&#xff0c;允许 JavaScript 为 <audio> 和 <video> 动态构造媒体源作用提供连续的音视频播放体验&…

【简博士统计学习方法】第1章:3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间&#xff08;Hypothesis Space&#xff09;&#xff1a;所有可能的条件概率分布或决策函数&#xff0c;用 F \mathcal{F} F表示。 若定义为决策函数的集合&#xff1a; F { f ∣ Y f ( X ) } \mathcal{F…

Linux内核 -- RTC 驱动的注册方式

Linux 内核中 RTC 驱动的注册方式 在 Linux 内核中&#xff0c;RTC&#xff08;Real-Time Clock&#xff09;驱动的注册可以通过多种方式实现&#xff0c;以下整理了常见的注册方式及其注意事项。 1. 使用 devm_rtc_device_register 这是注册 RTC 驱动的最常用方法&#xff…

JavaEE初阶——计算机工作原理

一、什么是JavaEE JavaEE&#xff08;Java Platform&#xff0c;Enterprise Edition&#xff09;是sun公司&#xff08;2009年4月20日甲骨文将其收购&#xff09;推出的企业级应用程序版本。这个版本以前称为 J2EE。能够帮助我们开发和部署可移植、健壮、可伸缩且安全的服务器…

多目标优化算法——基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA)

基于聚类的不规则Pareto前沿多目标优化自适应进化算法&#xff08;CA-MOEA&#xff09; 一、算法简介 简介&#xff1a; 现有的多目标进化算法&#xff08;moea&#xff09;在具有规则Pareto前沿且Pareto最优解在目标空间上连续分布的多目标优化问题&#xff08;MOPs&#xff…

短诗《腊八粥》

《腊八粥》现•佚名已买花生同煮粥&#xff0c;粥不似&#xff0c;少年稠也不复&#xff0c;少年仇亦不赴&#xff0c;少年愁终不负&#xff0c;少年筹 &#xff08;主编目前所有分类&#xff1a; 身&#xff0c;心&#xff0c;灵思 工作&#xff0c;生活 创作 剧 让世界更…

封装深拷贝方法

前言 在今年的四月份我写了一篇有关深拷贝的博客文章 我与深拷贝_radash 深拷贝-CSDN博客。在该文章中有一个令我感到遗憾的点就是我没有实现一个自己手写的深拷贝。如今我想弥补当初的遗憾&#xff0c;在这篇文章中详细的讲述一下如何手写一个深拷贝方法。 lodash中是如何实…

数据结构:树

数据结构中的树 树&#xff08;Tree&#xff09;是一种非线性数据结构&#xff0c;用于表示具有层次结构的数据。树结构由节点&#xff08;Node&#xff09;和边&#xff08;Edge&#xff09;组成&#xff0c;节点之间通过边连接&#xff0c;形成父子关系。树是一种抽象数据类…

【信息系统项目管理师】第15章:项目风险管理过程详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划风险管理1、输入2、工具与技术3、输出二、识别风险1、输入2、工具与技术3、输出三、实施定性风险分析1、输入2、工具与技术3、输出四、实施定量风险分析1、输入2、工具与技术3、输出五、规划风险应对1、…

flutter web 路由问题

开发问题背景&#xff1a; flutte 项目中开发网页暴露出来供外部的 网页调用&#xff0c;并不是跳转到项目的首页 项目中使用的路由是 GetX 4.6.0 存在的问题 跳回到首页的问题 web -> flutterflutter 使用 history.back 到web&#xff0c;web forward 到 flutter 此时…

在不到 5 分钟的时间内将威胁情报 PDF 添加为 AI 助手的自定义知识

作者&#xff1a;来自 Elastic jamesspi 安全运营团队通常会维护威胁情报报告的存储库&#xff0c;这些报告包含由报告提供商生成的大量知识。然而&#xff0c;挑战在于&#xff0c;这些报告的内容通常以 PDF 格式存在&#xff0c;使得在处理安全事件或调查时难以检索和引用相关…

二、模型训练与优化遇到的问题1:python=3.10:指定 Python 版本为 3.10。这里为什么指定版本为3.10,有什么依据

目录 一、Python 版本选择的依据 1. TensorFlow 和 Keras 的兼容性 2. Python 3.10 的优势 二、如何选择适合的 Python 版本 1. 检查 TensorFlow 的官方兼容性文档 2. 选择受支持且稳定的版本 3. 避免使用过于旧或过新的版本 三、如何在 Anaconda 中选择不同的 Python …

探索 Vue.js 的动态样式与交互:一个有趣的样式调整应用

修改日期备注2025.1.3初版 一、前言 今天和大家分享在 Vue.js 学习过程中开发的超酷的小应用。这个应用可以让我们通过一些简单的交互元素&#xff0c;如复选框、下拉菜单和输入框&#xff0c;来动态地改变页面上元素的样式哦 让我们一起深入了解一下这个项目的实现过程&…

css出现边框

前言 正常情况下&#xff0c;开启 contenteditable 属性后会出现 “黑色边框”。 如下图所示&#xff0c;很影响美观&#xff1a; 您可能想去掉它&#xff0c;就像下面这样&#xff1a; 解决方案 通过选择器&#xff0c;将 focus 聚焦时移除 outline 属性即可。 如下代码所示&a…