Android 视频边下边播,MP4头信息在后调整头信息
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头信息在后调整头信息相关推荐
- 0930 视频边下边播/蓝牙库/阿里博客/afnetworking详细/小程序工具
iOS视频边下边播–缓存播放数据流 简书: http://www.jianshu.com/p/990ee3db0563 简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac o ...
- [iOS]仿微博视频边下边播之滑动 TableView 自动播放
注意:框架已经迭代到2.0版本,我重新架构了整个框架,API 也得到了更好的设计,我为 2.0 版本的实现写了一篇文章 [iOS]如何重新架构 JPVideoPlayer ?.此文中的实现思路仍然是一 ...
- [iOS]仿微博视频边下边播之滑动TableView自动播放
Tips:这次的内容分为两篇文章讲述 01.[iOS]仿微博视频边下边播之封装播放器 讲述如何封装一个实现了边下边播并且缓存的视频播放器. 02.[iOS]仿微博视频边下边播之滑动TableView自 ...
- 仿微博视频边下边播之封装播放器
来源:NewPan(@盼盼_HKbuy) 链接:http://www.jianshu.com/p/0d4588a7540f Tips:这次的内容分为两篇文章讲述 01.[iOS]仿微博视频边下边播之封 ...
- iOS开发之仿微博视频边下边播之自定义AVPlayer播放器, 边下边播解剖。视频处理流程,建立连接-请求数据-统筹数据-解码数据-视频呈现
Tips:这次的内容分为两篇文章讲述 01.[iOS]仿微博视频边下边播之封装播放器 讲述如何封装一个实现了边下边播并且缓存的视频播放器. 02.[iOS]仿微博视频边下边播之滑动TableView自 ...
- 实现视频边下边播(视频MOOV信息前置)
(由于时间久,忘记原链接,仅把自己现在实现方式写出以供参考:) public class QtFastStart {public static boolean sDEBUG = false; priv ...
- java 视频边下边播,VideoViewDemo android 播放器,支持边下边播 238万源代码下载- www.pudn.com...
文件名称: VideoViewDemo下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 194 KB 上传时间: 2014-09-19 下载次数: 5 详细说明:a ...
- 关于Android HTTP边下边播
本文简单地分享一下在Android平台做HTTP边下载边播放的一些经验,希望对初学者有所帮助. 1. 为什么播放器在播放视频文件的时候,都知道该怎么去解码.该以怎样的时间间隔去显示每一帧呢? 因为无论 ...
- 迅雷 android下载地址 http,Android HTTP边下边播
本文简单地分享一下在Android平台做HTTP边下载边播放的一些经验,希望对初学者有所帮助. 1. 为什么播放器在播放视频文件的时候,都知道该怎么去解码.该以怎样的时间间隔去显示每一帧呢? 因为无论 ...
最新文章
- testng 定时构建_Jenkins使用安装:持续集成自动化方案 | Web自动化测试方案
- informix linux安装步骤
- 大佬(概率期望DP)
- oracle数据库存储ip地址,oracle – 以十进制形式存储的IP地址 – PL / SQL以虚线四边形显示...
- 热榜!基于jsp+mysql的JSP在线水果销售商城系统设计实现【建议收藏】
- 拼多多上线“女装11.11爆款必买团”活动 一款打底裤一天卖出4.2万单
- 让数据库运行在浏览器里?TiDB + WebAssembly 告诉你答案
- android 时钟动态图标,Android 8.1 Launcher3实现动态指针时钟功能
- 【工具】telnet用法
- 电脑装服务器系统没有网卡驱动,安装win10系统后没有网卡驱动的解决方法
- 【BDTC 2018】PingCAP申砾:做一个真正通用的数据库产品
- oracle克隆镜像,备份,迁移和克隆docker镜像
- 使用Apache poi生成excel并绘制折线统计图,扇形统计图
- [网络安全自学篇] 七十八.XSS跨站脚本攻击案例分享及总结(二)
- 如何用手机拍摄证件照片
- Java核心(集合类1-概述、Collection 接口 、List 集合)
- 区块链实战(一)实现简单的区块与区块链交易
- 【CSS3】---- 纯 css 控制 html5旋转音乐图标,控制背景音乐
- 利用Boot-Repair在三系统中修复ubuntu18
- HashMap与ConcurrentHashMap万字源码分析