h.264保存flv文件
首先 写flv头。
byte[] cFlvHeader = new byte[]{0x46,0x4C,0x56,0x01,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00};
WriteFile.writeBuf(cFlvHeader);
接下来写metadata,可有可无。
然后是sps、pps这些header。
private int genHeader(byte[] in, byte[] out) {
int index = 0;
// Frame Type and CodecID
out[index++] = 0x17;
// AVCPack etType if(CodecID == 7) 0 = AVC sequence header
out[index++] = 0x00;
// Composition time offset if(CodecID == 7 && AVCPack etType == 0) 这里为0
out[index++] = 0x00;
out[index++] = 0x00;
out[index++] = 0x00;
// configurationVersion 固定为1
out[index++] = 0x01;
int pos = findSecondNalPos(in);
int len = in.length;
// AVCProfileIndication profile_compatibility AVCLevelIndication
System.arraycopy(in, 5, out, index, 3);
index += 3;
// lengthSizeMinusOne
out[index++] = (byte) 0xFF;
// numOfSequenceParameterSets
out[index++] = (byte) 0xE1;
int spsLen = pos - 4;
// sps len
out[index++] = (byte) ((spsLen >> 8) & 0xFF);
out[index++] = (byte) (spsLen & 0xFF);
// sps
System.arraycopy(in, 4, out, index, spsLen);
index += spsLen;
out[index++] = 0x01;
int ppsLen = len - pos - 4;
// pps len
out[index++] = (byte) ((ppsLen >> 8) & 0xFF);
out[index++] = (byte) (ppsLen & 0xFF);
// pps
System.arraycopy(in, pos + 4, out, index, ppsLen);
index += ppsLen;
return index;
}
private int findSecondNalPos(byte[] buf) {
for (int i = 4; i < buf.length; i++) {
if (buf[i] == 0x00 && buf[i + 1] == 0x00 && buf[i + 2] == 0x00
&& buf[i + 3] == 0x01)
return i;
}
return -1;
}
最后就是将h264编码数据写入文件,注意不要0x00 0x00 0x00 0x01。
public int MakeFlv(byte[] pSrc, int nLen, int nTimeStamp) {
if (null != byteFlvData) {
byteFlvData[0] = 0x09;
byteFlvData[1] = (byte) ((nLen >> 16) & 0xff);
byteFlvData[2] = (byte) ((nLen >> 8) & 0xff);
byteFlvData[3] = (byte) (nLen & 0xff);
byteFlvData[6] = (byte) (nTimeStamp & 0xff);
byteFlvData[5] = (byte) ((nTimeStamp >> 8) & 0xff);
byteFlvData[4] = (byte) ((nTimeStamp >> 16) & 0xff);
byteFlvData[7] = 0;
byteFlvData[8] = 0;
byteFlvData[9] = 0;
byteFlvData[10] = 0;
System.arraycopy(pSrc, 0, byteFlvData, 11, nLen);
byte[] c = new byte[4];
int nLength = 11 + nLen;
c[0] = (byte) ((nLength >> 24) & 0xff);
c[1] = (byte) ((nLength >> 16) & 0xff);
c[2] = (byte) ((nLength >> 8) & 0xff);
c[3] = (byte) (nLength & 0xff);
System.arraycopy(c, 0, byteFlvData, nLength, 4);
return (nLen + 11 + 4);
}
return 0;
}
将byteFlvData写入文件即可。
h.264保存flv文件相关推荐
- H.264裸流文件中获取每一帧数据
测试解码器性能时,最常用的无非是向解码器中推送码流. 之前封装了一个avc的解码器,想做一个测试,读取H.264裸流文件将码流定期定时推送到解码器. 测试其实很简单: 1.了解H.264裸流文件的构成 ...
- 认识高清视频编码(MPEG、H.264、WMV-HD、RMVB)
文章出处:www.net1980.com 原创 最近两年,"高清"这个词语非常火热,已经成为家电和IT行业的最新潮流了.高清视频和普通视频有什么区别呢?主要是分辨率上的区别,720 ...
- 最简单的视频编码器:基于libx264(编码YUV为H.264)
===================================================== 最简单的视频编码器系列文章列表: 最简单的视频编码器:编译 最简单的视频编码器:基于libx ...
- H.264简单码流分析
使用Elecard Stream Eye分析了一个H.264码流文件. 得到的结果如下: I帧: 宏块类型(红色代表I宏块) 宏块划分(4x4,16x16) 宏块大小(颜色越浅,越大) P帧: 宏块划 ...
- H.264与x264的区别
1.H.264是MPEG4的第十部分,是一个标准. 对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. 2.x264是一个编码器, ...
- 关于H.264 x264 h264 AVC1
1. H.264是MPEG4的第十部分,是一个标准.对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. 2.x264是一个编码器, ...
- H.264——使用H.264视频编解码器JM进行YUV图像序列的编解码
目录 常见H.264视频编码器 JM基础配置 准备一个YUV视频 JM实现编码 修改配置文件 Encoder Control 编译运行 JM实现解码 如何判断编码解码是否正确 常见H.264视频编码器 ...
- H.264 x264 h264 AVC1的关系和区别
H.264是MPEG4的第十部分,是一个标准. 对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. x264是一个编码器,他参照的 ...
- 关于H.264 x264 h264 AVC1之间的那些事
1. H.264是MPEG4的第十部分,是一个标准. 对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC.2.x264是一个编码器, ...
最新文章
- Wix中注册c#开发的Activex控件
- python求众数程序_python求众数问题实例
- js---PC端滑动进度条
- Error while adding the mapper ‘interface *****类‘ to configuration报错原因
- oracle加大内存对大表,在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能...
- 那些有关求解next数组的算法
- 使用命名空间别名限定符 ::
- 实现Kubernetes跨集群服务应用的高可用
- python 浮点数比较_Python中的浮点数
- 计算机html二级难度,计算机二级考试越来越难的实锤!真实数据告诉你到底难在哪里?...
- js中的call及apply
- 油猴管理程序复制百度文库网页内容
- 用javaScript制作星空特效
- 物联网芯片并非单一产品,目前主要划分为哪几芯片?
- 赊了两串冰糖葫芦才写出来的小结
- Final Cut Pro资源库占用内存太大如何释放磁盘空间?
- 根据url地址生成二维码,微信扫描二维码可直接打开网址
- 人工智能安全的若干研究课题
- 一年一度的科技狂欢盛会——2022亚马逊云科技re:Invent全球大会
- V4L2 常用控制命令。
热门文章
- HTML标记语言——表单的详细使用说明
- python start
- 踏踏实实学javascript--javascript中的变量
- 在C#中调用Java代码
- 深入学习 Redis(1):Redis 内存模型
- 智能听音公司Soundhawk获得550万美元融资,通过降噪算法让用户听到真正想听的声音
- 【Golang】关于从切片中删除某个元素时会覆盖底层数组的说明
- php删除下拉框记录,删除一条数据_php删除一条记录(删除确认提示)
- linux安装7z到指定目录,linux下安装7zip
- 本地html调试java接口_solr源码通过idea进行本地调试