MP4文件格式详解:结构、track与sample描述

4星 · 超过85%的资源 需积分: 14 84 下载量 156 浏览量 更新于2024-07-23 2 收藏 3.04MB PDF 举报
MP4文件格式详解 MP4是一种广泛应用于数字媒体存储和传输的容器格式,它由ISO/IEC 14496-12标准定义,用于封装各种类型的数据,包括视频、音频、文本和元数据等。MP4文件的核心结构是基于一种被称为“movie”或“moov”(电影)的容器,它是一个逻辑上的组织单元,包含了整个媒体内容的编解码信息和各个track(轨道)。 在MP4文件中,一个movie通常由多个track组成,每个track代表一种媒体类型,如视频、音频或字幕,它们按时间线顺序呈现。例如,视频track包含一系列的video samples(帧),而音频track则是由audio samples(音频数据单元)构成。与传统的多媒体文件不同,MP4不局限于将媒体数据以帧为单位紧密排列,而是提供了更大的灵活性。 每个track都有一个或多个sample descriptions,这些描述包含了如何解码sample的必要信息,比如采用的编码算法和参数。通过这些描述,播放器可以根据需要动态解析和处理不同类型的samples。此外,MP4允许文件的物理格式和数据布局独立于媒体的时间顺序,这意味着音频和视频数据可以在文件中交错存储,提高了文件的压缩效率和存储密度。 MP4文件中的“box”是关键的概念,它们是文件结构的基本元素,如trak、mdat(媒体数据)、moov(电影头)等。trak box包含了关于track的信息,而mdat盒则存放实际的样本数据。moov box位于文件的开头,存储了整个movie的全局信息,如时间戳和索引,使得快速查找和播放成为可能。 理解MP4文件格式的关键在于掌握这些核心组件及其交互方式。MP4的设计旨在提供高效、灵活且兼容广泛的多媒体存储解决方案,使得不同类型的媒体能够在同一文件中无缝集成,并且支持跨平台播放。随着技术的发展,MP4标准也在不断更新,以适应新的编码技术和流媒体需求。

//package com.javakc.javaQ.servlet; // //import jakarta.servlet.ServletException; //import jakarta.servlet.annotation.WebServlet; //import jakarta.servlet.http.HttpServlet; //import jakarta.servlet.http.HttpServletRequest; //import jakarta.servlet.http.HttpServletResponse; // //import java.io.IOException; // ///** // * // */ //@WebServlet( // name = "ResponseServlet", // urlPatterns = "/response.do", // loadOnStartup = 0 //) // //public class ResponseServlet extends HttpServlet { // @Override // protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // // } //} package com.javakc.javaQ.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; @WebServlet( name = "ResponsvleteSer", urlPatterns = "/Sp.do" ) public class ResponseServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String type = req.getParameter("type"); String video = "E:\\学习\\javaQ\\javaQ\\src\\main\\webapp\\views\\yemian\\11.mp4"; Path p = Path.of(video ); byte[] b = Files.readAllBytes(p); resp.setContentType("video/mpeg4"); OutputStream ops = resp.getOutputStream(); System.out.println(b.length); if (type.equals("1")) { ops.write(b); ops.flush(); ops.close(); } if (type.equals("2")) { FileInputStream f=new FileInputStream(video ); byte[] b1=new byte[100]; int len=0; while ((len=f.read(b1))!=-1){ ops.write(b1,0,len); try { Thread.sleep(1); } catch (InterruptedException e) { throw new RuntimeException(e); } ops.flush(); } ops.close(); } } }

2023-06-10 上传