mp4v2 和mp4的一些基础知识

由于项目需要做mp4文件的合成(264+aac)和mp4文件的解析; 
MP4文件本身就是一个容器,对于视频来说就是把不同的内容放按照mp4的规则存放而已; 
如果完全自己写代码实现,可能需要完全理解mp4的规则;才能做好mp4文件的解析; 
测试过程中,考虑到简单易用性同时对生成mp4文件的兼容性考虑,采用开源项目mp4v2作为mp4文件的muxer和demuxer工具;

1.mp4v2 源代码下载.

http://www.codeforge.cn/article/259182 
最新版本是mp4v2-2.0.0

2.mp4v2 Linux编译

  1. ./configure –prefix=/home/installtest/ disable-debug disable-shared
  2. make
  3. make install

3.mp4v2一些基本sample的使用

其实在sample下面这些基本的命令代码基本以及包含常用mp4v2的api使用方法.

  1. -rwxr-xr-x 1 ll ll 405K Nov 4 15:49 mp4art
  2. -rwxr-xr-x 1 ll ll 598K Nov 4 15:49 mp4chaps
  3. -rwxr-xr-x 1 ll ll 162K Nov 4 15:49 mp4extract
  4. -rwxr-xr-x 1 ll ll 241K Nov 4 15:49 mp4file
  5. -rwxr-xr-x 1 ll ll 511K Nov 4 15:49 mp4info
  6. -rwxr-xr-x 1 ll ll 164K Nov 4 15:49 mp4subtitle
  7. -rwxr-xr-x 1 ll ll 279K Nov 4 15:49 mp4tags
  8. -rwxr-xr-x 1 ll ll 860K Nov 4 15:49 mp4track
  9. -rwxr-xr-x 1 ll ll 98K Nov 4 15:49 mp4trackdump

4.mp4文件一些基础知识

  1. ./mp4info 20161024091151_180.MP4
  2. ./mp4info version 2.0.
  3. 20161024091151_180.MP4 :
  4. Track Type Info
  5. audio MPEG- AAC LC, 180.096 secs, kbps, Hz
  6. video H264 Baseline@4.2, 180.000 secs, kbps, 1920x1080 @ 30.000000 fps
  7. ./mp4track 20161024091151_180.MP4 --list
  8. track[] id=
  9. type = audio
  10. enabled = true
  11. inMovie = false
  12. inPreview = false
  13. layer =
  14. alternateGroup =
  15. volume = 1.0000
  16. width = 0.00000000
  17. height = 0.00000000
  18. language = Undetermined
  19. handlerName =
  20. userDataName = <absent>
  21. track[] id=
  22. type = video
  23. enabled = true
  24. inMovie = false
  25. inPreview = false
  26. layer =
  27. alternateGroup =
  28. volume = 0.0000
  29. width = 1920.00000000
  30. height = 1080.00000000
  31. language = Undetermined
  32. handlerName =
  33. userDataName = <absent>

解析mp4的一些基本内容;比如长宽 和trackid 音视频的编码算法等等基本知识;

比如解析track 2 是一个视频通道,这个id从面mp4track 内容里面获取的.

  1. ./mp4trackdump 20161024091151_180.MP4 -t
  2. ./mp4trackdump version 2.0.
  3. mp4file 20161024091151_180.MP4, track , samples , timescale
  4. sampleId , size duration time ::00.000 S
  5. sampleId , size duration time ::00.033
  6. sampleId , size duration time ::00.066
  7. sampleId , size duration time ::00.100
  8. sampleId , size duration time ::00.133
  9. sampleId , size duration time ::00.166
  10. sampleId , size duration time ::00.200

这儿有一些关键信息:

sampleId 就是mp4 里面frame的索引;每个sampleId 对应一帧264的视频 
size 就是frame的大小 
duration 这个是给播放器使用的,播放器需要显示这一帧的时间就是 3000 / 90000 (timescale) 秒;这个视频是30帧的,就是1/30秒;后面的rtsp发流的时间撮也是根据这个时间来处理的; 
后面的时间就是转化为秒为单位的时间;

比如解析track 1 音频通道

  1. ./mp4trackdump 20161024091151_180.MP4 -t
  2. ./mp4trackdump version 2.0.
  3. mp4file 20161024091151_180.MP4, track , samples , timescale
  4. sampleId , size duration time ::00.000 S
  5. sampleId , size duration time ::00.128 S
  6. sampleId , size duration time ::00.256 S
  7. sampleId , size duration time ::00.384 S
  8. sampleId , size duration time ::00.512 S
  9. sampleId , size duration time ::00.640 S
  10. sampleId , size duration time ::00.768 S
  11. sampleId , size duration time ::00.896 S
  12. sampleId , size duration time ::01.024 S
  13. sampleId , size duration time ::01.152 S

sampleId 就是mp4 里面aac frame的索引;每个sampleId 对应一阵aac的视频 
size 就是frame的大小 
duration 音频和视频一样,1024 就是在1024/8000 S时间内音频采样数据通过aac压缩算后得到的,其它音频算法压缩算法也基本一样; 
后面的时间就是转化为秒为单位的时间;

mp4v2的api就是隐藏了复杂的mp4结构解析流程,返回给用户直接是一帧帧数据的方式; 
你只需要通过对应的接口~以帧的方式读取处理即可;

简单高效,基本和其它的文件操作没啥区别;

mp4v2 基本知识的更多相关文章

  1. 嵌入式 使用mp4v2将H264+AAC合成mp4文件

    录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...

  2. 使用mp4v2将H264+AAC合成mp4文件

    录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...

  3. MP4v2 基本使用(二)

    MP4转H264文件 本文最目标是基本的MP4v2接口的使用,并且实现一个简单的提取mp4文件里面264流的功能: 1.264文件基本知识 下看看H264文件的基本常识 NAL 头 0x00 0x00 ...

  4. 00.mp4v2工具的用法

    1.交叉编译mp4v2库# ./configure --prefix=/usr/local/mp4v2-2.0.0 --host=arm-hisiv300-linux  CC=arm-hisiv300 ...

  5. 你必须知道的EF知识和经验

    注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...

  6. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  7. 学点HTTP知识

    不学无术 又一次感觉到不学无术,被人一问Http知识尽然一点也没答上来,丢人丢到家了啊.平时也看许多的技术文章,为什么到了关键时刻就答不上来呢? 确实发现一个问题,光看是没有用的,需要实践.看别人说的 ...

  8. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  9. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

随机推荐

  1. codeforces 888A/B/C/D/E - [数学题の小合集]

    这次CF不是很难,我这种弱鸡都能在半个小时内连A四道……不过E题没想到还有这种折半+状压枚举+二分的骚操作,后面就挂G了…… A.Local Extrema 题目链接:https://cn.vjudg ...

  2. codeforces 14A - Letter & codeforces 859B - Lazy Security Guard - [周赛水题]

    就像title说的,是昨天(2017/9/17)周赛的两道水题…… 题目链接:http://codeforces.com/problemset/problem/14/A time limit per ...

  3. centos7设置iptables

    https://www.linuxidc.com/Linux/2017-10/147238.htm

  4. AppFog使用

    cd ‘你的应用目录’ af login(之后输入你的邮箱和密码) af update ‘你的应用名’ 相关文档:https://docs.appfog.com/getting-started/af- ...

  5. Ajax返回乱码

    1.关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码,contentType的charset是指服务器发送给客户端时的 ...

  6. java-mybaits-011-mybatis-拦截器计算耗时

    实现Mybatis官方提供的拦截器,用于记录SQL语句的执行时间 package com.github.bjlhx15.mybatis; /** * @author lihongxu * @since ...

  7. c#按照指定长度切分字符串

    int pageSize=5; var array = new List<string>(); ----------方法1-------------------- var pageCoun ...

  8. spring security积累

    使用数据库管理用户权限: Spring Security默认情况下需要两张表,用户表和权限表 create table users( username varchar_ignorecase(50) n ...

  9. SSM请求的响应

    1.请求响应文本到页面直接用pw.println("文本信息");打印到页面: 2.如果请求方法前不加@ResponseBody,返回字符串直接转发到对应的页面: 3.如果请求方法 ...

  10. 什么是anaconda【转载】

    转自:https://zhidao.baidu.com/question/525102108723657245.html https://zhidao.baidu.com/question/62475 ...