当前位置: 首页 > news >正文

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. 支持按需加载视频片段。
<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 流。


http://www.mrgr.cn/news/82949.html

相关文章:

  • 一、准备工作(1):在计算机中安装Python
  • 排序算法:冒泡排序
  • [项目实战2]贪吃蛇游戏
  • PyCharm简单调试
  • 基于SpringBoot的斯诺克球馆预约购票管理系统
  • React+redux项目搭建流程
  • Docker: 教程07 - ( 如何对 Docker 进行降级和升级)
  • STM32学习(十)
  • 嵌入式系统 (1.绪论)
  • GCC使用说明
  • .NET体系架构
  • 编排式 Saga 模式
  • 通过gradle发布aar或jar携带sources-jar到maven nexus
  • 【简博士统计学习方法】第1章:7. 生成模型与判别模型
  • HarmonyOS开发:粒子动画应用实战
  • TCP 套接字 方法
  • 我在广州学 Mysql 系列——与索引相关的练习题
  • 前端 动图方案
  • C#—Task异步的常用方法及TaskFactory工厂类详解
  • ELK实战(最详细)
  • cuda实现flash_attn_mma_share_kv源码分析
  • 用VS C#构建Windows服务【纯操作版,附带项目地址】
  • [开源]自动化定位建图系统
  • A/B实验之置信检验(一):如何避免误判 (I类) 和漏报 (II类)
  • 137. 只出现一次的数字 II
  • 【Rust自学】10.8. 生命周期 Pt.4:方法定义中的生命周期标注与静态生命周期