首先 写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文件相关推荐

  1. H.264裸流文件中获取每一帧数据

    测试解码器性能时,最常用的无非是向解码器中推送码流. 之前封装了一个avc的解码器,想做一个测试,读取H.264裸流文件将码流定期定时推送到解码器. 测试其实很简单: 1.了解H.264裸流文件的构成 ...

  2. 认识高清视频编码(MPEG、H.264、WMV-HD、RMVB)

    文章出处:www.net1980.com 原创 最近两年,"高清"这个词语非常火热,已经成为家电和IT行业的最新潮流了.高清视频和普通视频有什么区别呢?主要是分辨率上的区别,720 ...

  3. 最简单的视频编码器:基于libx264(编码YUV为H.264)

    ===================================================== 最简单的视频编码器系列文章列表: 最简单的视频编码器:编译 最简单的视频编码器:基于libx ...

  4. H.264简单码流分析

    使用Elecard Stream Eye分析了一个H.264码流文件. 得到的结果如下: I帧: 宏块类型(红色代表I宏块) 宏块划分(4x4,16x16) 宏块大小(颜色越浅,越大) P帧: 宏块划 ...

  5. H.264与x264的区别

    1.H.264是MPEG4的第十部分,是一个标准. 对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. 2.x264是一个编码器, ...

  6. 关于H.264 x264 h264 AVC1

    1. H.264是MPEG4的第十部分,是一个标准.对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. 2.x264是一个编码器, ...

  7. H.264——使用H.264视频编解码器JM进行YUV图像序列的编解码

    目录 常见H.264视频编码器 JM基础配置 准备一个YUV视频 JM实现编码 修改配置文件 Encoder Control 编译运行 JM实现解码 如何判断编码解码是否正确 常见H.264视频编码器 ...

  8. H.264 x264 h264 AVC1的关系和区别

    H.264是MPEG4的第十部分,是一个标准. 对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. x264是一个编码器,他参照的 ...

  9. 关于H.264 x264 h264 AVC1之间的那些事

    1. H.264是MPEG4的第十部分,是一个标准. 对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC.2.x264是一个编码器, ...

最新文章

  1. Wix中注册c#开发的Activex控件
  2. python求众数程序_python求众数问题实例
  3. js---PC端滑动进度条
  4. Error while adding the mapper ‘interface *****类‘ to configuration报错原因
  5. oracle加大内存对大表,在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能...
  6. 那些有关求解next数组的算法
  7. 使用命名空间别名限定符 ::
  8. 实现Kubernetes跨集群服务应用的高可用
  9. python 浮点数比较_Python中的浮点数
  10. 计算机html二级难度,计算机二级考试越来越难的实锤!真实数据告诉你到底难在哪里?...
  11. js中的call及apply
  12. 油猴管理程序复制百度文库网页内容
  13. 用javaScript制作星空特效
  14. 物联网芯片并非单一产品,目前主要划分为哪几芯片?
  15. 赊了两串冰糖葫芦才写出来的小结
  16. Final Cut Pro资源库占用内存太大如何释放磁盘空间?
  17. 根据url地址生成二维码,微信扫描二维码可直接打开网址
  18. 人工智能安全的若干研究课题
  19. 一年一度的科技狂欢盛会——2022亚马逊云科技re:Invent全球大会
  20. V4L2 常用控制命令。

热门文章

  1. HTML标记语言——表单的详细使用说明
  2. python start
  3. 踏踏实实学javascript--javascript中的变量
  4. 在C#中调用Java代码
  5. 深入学习 Redis(1):Redis 内存模型
  6. 智能听音公司Soundhawk获得550万美元融资,通过降噪算法让用户听到真正想听的声音
  7. 【Golang】关于从切片中删除某个元素时会覆盖底层数组的说明
  8. php删除下拉框记录,删除一条数据_php删除一条记录(删除确认提示)
  9. linux安装7z到指定目录,linux下安装7zip
  10. 本地html调试java接口_solr源码通过idea进行本地调试