mp4视频有两种格式,一种视频头信息在前,这种直接可以先缓存头信息,然后直接边下边播,还有一种是头信息在最后,这种情况下则需要处理mp4的头信息,并调整mp4的格式。

mp4文件的格式如下图

图1

从图中可以看出这个视频文件第一层有4部分,每一部分都是一个box,分别为:ftype,moov,free,mdat。其实mp4文件是有许多的box组成的。

而moov中存放了视频播放需要的头信息,如下图:

图2

所以视频播放必须先得获取到视频的moov信息,而MP4的格式中moov信息一种是在最开始,一种是在尾部,在尾部则必须调整到视频头部才能顺序播放,同时moov里面的box信息也需要调整,

下图是一段调整代码:

private processMoovBox(byte[] moov_atom, intindex) {

inti,atom_size,offset_count,current_offset;

String atom_type;

intmoov_atom_size = moov_atom.length-ftyp.length;

try{

for(i = index;i < moov_atom_size -4;i++) {

atom_type = convertHexToString(byteArr2HexStr(moov_atom,i));

if(atom_type.equals("stco")) {

atom_size = Integer.parseInt(byteArr2HexStr(moov_atom,i -4),16);

if(i + atom_size -4> moov_atom_size) {

return;

}

offset_count = Integer.parseInt(byteArr2HexStr(moov_atom,i +8),16);

for(intj =0;j < offset_count;j++) {

current_offset = Integer.parseInt(byteArr2HexStr(moov_atom,i +12+ j *4),16);

current_offset += moov_atom_size -freeLength;

moov_atom[i +12+ j *4+0] = (byte) ((current_offset >>24) &0xFF);

moov_atom[i +12+ j *4+1] = (byte) ((current_offset >>16) &0xFF);

moov_atom[i +12+ j *4+2] = (byte) ((current_offset >>8) &0xFF);

moov_atom[i +12+ j *4+3] = (byte) ((current_offset >>0) &0xFF);

}

i += atom_size -4;

}else if(atom_type.equals("co64")) {

atom_size = Integer.parseInt(byteArr2HexStr(moov_atom,i -4),16);

if(i + atom_size -4> moov_atom_size) {

return;

}

offset_count = Integer.parseInt(byteArr2HexStr(moov_atom,i +8),16);

for(intj =0;j < offset_count;j++) {

current_offset = Integer.parseInt(byteArr2HexStr(moov_atom,i +12+ j *8),16);

current_offset += moov_atom_size -freeLength;

moov_atom[i +12+ j *8+0] = (byte) ((current_offset >>56) &0xFF);

moov_atom[i +12+ j *8+1] = (byte) ((current_offset >>48) &0xFF);

moov_atom[i +12+ j *8+2] = (byte) ((current_offset >>40) &0xFF);

moov_atom[i +12+ j *8+3] = (byte) ((current_offset >>32) &0xFF);

moov_atom[i +12+ j *8+4] = (byte) ((current_offset >>24) &0xFF);

moov_atom[i +12+ j *8+5] = (byte) ((current_offset >>16) &0xFF);

moov_atom[i +12+ j *8+6] = (byte) ((current_offset >>8) &0xFF);

moov_atom[i +12+ j *8+7] = (byte) ((current_offset >>0) &0xFF);

}

i += atom_size -4;

}

}

}catch(Exception e) {

e.printStackTrace();

}

}

这样根据视频流里面的数据就可以解析出mp4的每个字段大小及对应的位置,然后根据位置可下载对应的数据。

Android 视频边下边播,MP4头信息在后调整头信息相关推荐

  1. 0930 视频边下边播/蓝牙库/阿里博客/afnetworking详细/小程序工具

    iOS视频边下边播–缓存播放数据流 简书: http://www.jianshu.com/p/990ee3db0563 简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac o ...

  2. [iOS]仿微博视频边下边播之滑动 TableView 自动播放

    注意:框架已经迭代到2.0版本,我重新架构了整个框架,API 也得到了更好的设计,我为 2.0 版本的实现写了一篇文章 [iOS]如何重新架构 JPVideoPlayer ?.此文中的实现思路仍然是一 ...

  3. [iOS]仿微博视频边下边播之滑动TableView自动播放

    Tips:这次的内容分为两篇文章讲述 01.[iOS]仿微博视频边下边播之封装播放器 讲述如何封装一个实现了边下边播并且缓存的视频播放器. 02.[iOS]仿微博视频边下边播之滑动TableView自 ...

  4. 仿微博视频边下边播之封装播放器

    来源:NewPan(@盼盼_HKbuy) 链接:http://www.jianshu.com/p/0d4588a7540f Tips:这次的内容分为两篇文章讲述 01.[iOS]仿微博视频边下边播之封 ...

  5. iOS开发之仿微博视频边下边播之自定义AVPlayer播放器, 边下边播解剖。视频处理流程,建立连接-请求数据-统筹数据-解码数据-视频呈现

    Tips:这次的内容分为两篇文章讲述 01.[iOS]仿微博视频边下边播之封装播放器 讲述如何封装一个实现了边下边播并且缓存的视频播放器. 02.[iOS]仿微博视频边下边播之滑动TableView自 ...

  6. 实现视频边下边播(视频MOOV信息前置)

    (由于时间久,忘记原链接,仅把自己现在实现方式写出以供参考:) public class QtFastStart {public static boolean sDEBUG = false; priv ...

  7. java 视频边下边播,VideoViewDemo android 播放器,支持边下边播 238万源代码下载- www.pudn.com...

    文件名称: VideoViewDemo下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 194 KB 上传时间: 2014-09-19 下载次数: 5 详细说明:a ...

  8. 关于Android HTTP边下边播

    本文简单地分享一下在Android平台做HTTP边下载边播放的一些经验,希望对初学者有所帮助. 1. 为什么播放器在播放视频文件的时候,都知道该怎么去解码.该以怎样的时间间隔去显示每一帧呢? 因为无论 ...

  9. 迅雷 android下载地址 http,Android HTTP边下边播

    本文简单地分享一下在Android平台做HTTP边下载边播放的一些经验,希望对初学者有所帮助. 1. 为什么播放器在播放视频文件的时候,都知道该怎么去解码.该以怎样的时间间隔去显示每一帧呢? 因为无论 ...

最新文章

  1. testng 定时构建_Jenkins使用安装:持续集成自动化方案 | Web自动化测试方案
  2. informix linux安装步骤
  3. 大佬(概率期望DP)
  4. oracle数据库存储ip地址,oracle – 以十进制形式存储的IP地址 – PL / SQL以虚线四边形显示...
  5. 热榜!基于jsp+mysql的JSP在线水果销售商城系统设计实现【建议收藏】
  6. 拼多多上线“女装11.11爆款必买团”活动 一款打底裤一天卖出4.2万单
  7. 让数据库运行在浏览器里?TiDB + WebAssembly 告诉你答案
  8. android 时钟动态图标,Android 8.1 Launcher3实现动态指针时钟功能
  9. 【工具】telnet用法
  10. 电脑装服务器系统没有网卡驱动,安装win10系统后没有网卡驱动的解决方法
  11. 【BDTC 2018】PingCAP申砾:做一个真正通用的数据库产品
  12. oracle克隆镜像,备份,迁移和克隆docker镜像
  13. 使用Apache poi生成excel并绘制折线统计图,扇形统计图
  14. [网络安全自学篇] 七十八.XSS跨站脚本攻击案例分享及总结(二)
  15. 如何用手机拍摄证件照片
  16. Java核心(集合类1-概述、Collection 接口 、List 集合)
  17. 区块链实战(一)实现简单的区块与区块链交易
  18. 【CSS3】---- 纯 css 控制 html5旋转音乐图标,控制背景音乐
  19. 利用Boot-Repair在三系统中修复ubuntu18
  20. HashMap与ConcurrentHashMap万字源码分析

热门文章

  1. C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件)
  2. Git-删除暂存区文件
  3. FIL最新消息 Lotus是什么?与 FIL什么关系
  4. 面向资源受限安全芯片的开放式运行环境设计
  5. 建一个网站需要多少钱
  6. 搞笑--为毛我顶多是个包工头
  7. 每日新闻:麦肯锡:未来10年 人工智能为全球GDP贡献1.2%增长;工信部下发第19批CDN、云服务牌照...
  8. HTML CSS整理笔记(建议收藏)
  9. 最短路问题的线性规划模型
  10. consol.log()的封装