zoukankan      html  css  js  c++  java
  • mp4文件DASH切片程序

    mp4文件DASH切片程序

    一、简介

    按照DASH标准文档要求与现有的DASH切片(生成DASH切片参见mb4box命令简介)来生成Initialization Segment与Media Segment两种切片,Initialization Segment就是在原来的mp4文件里去除数据box同时添加mvex box的文件,Media Segment里面保存的是sample数据。

    生成切片先要获取两个信息:

    1、每个sample起始位置与大小。

    sample的起始位置与大小获取要涉及到stsc box,stco box和stsz box,通过stsc box获取trunk列表以及每一个trunk包含sample个数,注意entry_count==1的情况,这样一个trunk里只有一个sample,chunk与sample的数量相等。通过stco box可以获取每一个trunk的起始位置与大小,通过stsz box可以获取每个sample大小的列表,这3个列表都通过sample index关联起来,sample index从从1开始计数。通过这3个box可以得到每一个sample的起始于大小。

    2、每个sample的delta信息。

    sample的delta信息可以通过stts box获取,在解析时注意entry_count为1的情况,这种情况下所有的sample都有相同的delta值。

    有了每个sample的位置大小与delta信息后就可以根据标准生成切片文件了。

    二、分两步走具体介绍

    1、扫描mp4文件,记录以下信息

    1.1 每个box的start size信息,扫描后生成一个boxInfo的列表

    数据结构

    typedef struct {

        std::string type;

        long pos;

        long size;

    }BoxInfo;

    1.2 解析stsc box生成stscInfo列表

    StstInfo

    typedef struct{

        unsigned int first_chunk;

        unsigned int samples_per_chunk;

        unsigned int sample_description_index;

    }StscInfo;

    1.3 解析stco box生成chunkInfo 列表

    typedef struct{

        unsigned int chunk_index;

        unsigned int offset;

        unsigned int sample_count;

        unsigned int sample_description_index;

    }ChunkInfo;

    1.4 解析stsz box生成sampleList

    typedef struct{

        unsigned int sample_index;

        unsigned int offset;

        unsigned int size;

        unsigned int delta;

        unsigned int chunk_index;

        unsigned int sample_description_index;

    }SampleInfo;

    然后结合上面两个列表完善sample的信息。

    1.5 解析时注意有些box的flag选项会指示使用后续的那些可选参数

    2、根据扫描的信息生成初始化切片与数据切片

    剩下的就是力气活了,按照标准组装就可以了

    生成切片注意:

    media切片

    moof TrackRunEntry Size是后面跟随的mdat里每个sample的大小

    sidx 的referenced_size是下面的moof size加上mdat size

    trun DataOffset是表示mdat box里的数据相对与moof开始(length字节开始)的偏移量

    tfdt baseMediaDecodeTime是之前所有切片时间和delta

    trun sample_duration在播放时会统计,与tfdt 里的baseMediaDecodeTime比较

    init切片

    与原有的mp4相比去掉mdat box,在moov里添加mvex box指示存在数据切片。

    三、mp4box命令

    切片

    mp4box -dash 10000  -rap  -segment-name myDash  4.mp4

    查看文件信息

    mp4box -info x.mp4

    生成xml文件格式的信息

    mp4box -diso  x.mp4

    四、播放器

    ExoPlayer

    mp4client

  • 相关阅读:
    log4j
    JDBCtemplete 模板
    动态代理 aop切面实现事务管理
    spring
    spring mvc 简单实现及相关配置实现
    ssm整合
    Jquery
    Git分布式版本控制系统
    Java web server 基本实现原理
    jvm
  • 原文地址:https://www.cnblogs.com/mingzhang/p/8447103.html
Copyright © 2011-2022 走看看