项目的代码位于https://github.com/oyz/flvmerge

该项目的源码数量较少,一些控制流程的函数不做分析,只将比较重要的内容进行分析。

判断是否可以被合并函数

int IsSuitableToMerge(FLVContext *flvCtx1, FLVContext *flvCtx2)
{
    return (flvCtx1->soundFormat == flvCtx2->soundFormat) &&
      (flvCtx1->soundRate == flvCtx2->soundRate) &&
      (flvCtx1->soundSize == flvCtx2->soundSize) &&
      (flvCtx1->soundType == flvCtx2->soundType) &&
      (flvCtx1->videoCodecID == flvCtx2->videoCodecID);
}

该项目中,视频的编码格式需要保持相同,应该是FLV1和FLV2的编码其均为H264,如果一个是H264一个不是H264合并会导致失败,声音格式,声音比特率,音频编码类型等。

没有规定一定需要保持相同的视频分辨率等。经过我测试,不同分辨率FLV的合并可以成功。

//添加文件内容
int AddFileData(
 FILE* inputFile,//输入文件
 FILE* mergeFile, //合并文件
 int isFirstFile, //是否为第一个文件
 UInt32* lastTimestamp)//最后的时间戳
{
    int readLen;
    UInt32 curTimestamp = 0;
    UInt32 newTimestamp = 0;
    int dataSize;
    UInt8 tmp[20];
    char *buf;

assert(inputFile != NULL && mergeFile != NULL);

if (NULL == (buf=(char*)malloc(sizeof(char)*MAX_DATA_SIZE))) 
 {
  fprintf(stderr, "malloc error!\n");
  return -1;
    }

if (inputFile != NULL && mergeFile != NULL)
 {
  //fseek(stream, 0L, SEEK_SET);流移指针指向文件头
  rewind(inputFile);
  //如果是第一个文件
  if (isFirstFile) 
  {
   //读取flv 头长度+4长度
      if ( FLV_HEADER_SIZE+4 == (readLen=fread(tmp, sizeof(UInt8), FLV_HEADER_SIZE+4, inputFile)) ) 
   {
    rewind(mergeFile);
    if (readLen != fwrite(tmp, sizeof(char),readLen, mergeFile)) 
    {
        goto failed;
    }
      } 
   else
   {
    goto failed;
      }
  } 
  else 
  {
      if (fseek(inputFile, FLV_HEADER_SIZE+4, SEEK_CUR) != 0)
        goto failed;
  }
  
  //读取FLV TAG
  while (ReadFromFile(inputFile, (char*)tmp, FLV_TAG_HEADER_SIZE) > 0) 
  {
   //读取数据长度
      dataSize = FromInt24StringBe(&tmp[1]);
   //获得当前时间戳
      curTimestamp = GetTimestamp(&tmp[4]);
   //获得新的时间戳
      newTimestamp = curTimestamp + *lastTimestamp;
   //设置新的时间戳
      SetTimestamp(&tmp[4], newTimestamp);
   //写入TAG
      if (WriteToFile(mergeFile, (char*)tmp, FLV_TAG_HEADER_SIZE) < 0)
        goto failed;

readLen = dataSize+4;
    
      if (ReadFromFile(inputFile, buf, readLen) > 0) 
   {
    if (WriteToFile(mergeFile, buf, readLen) < 0)
       goto failed;
      }
   else 
      {
    goto failed;
      }
  }

// update the timestamp and return
  *lastTimestamp = newTimestamp;

free(buf);
  buf = NULL;
  return 0;
    }

failed:
    free(buf);
    buf = NULL;
    return -1;
}

这段代码中用于将需要合并的FLV文件的TAG提取出来,接着上一个文件的TAG重新计算时间戳。

我在使用的时候将IsSuitableToMerge代码注释掉了

FLV合并开源代码flvmerge分析相关推荐

  1. git合并丢失代码问题分析与解决

    git合并丢失代码问题分析与解决(错误操作导致) git revert后导致合并代码丢失 起因 我有一个开发分支antd3.x和一个主分支develop,我在合并antd3.x到develop的时候发 ...

  2. 开源代码分析技巧之三——老外如是说

    开源代码分析技巧之三--老外如是说 继续从深入分析开源代码说起,当然源码分析没有太多捷径可走.笔者只是探讨下,如何分析会更好些.特通过Samba技术邮件群组,向老外提问"如何更好的分析Sam ...

  3. 分析FLV文件分析和解析器的开源代码

    分析一下GitHub上一份FLV文件分析和解析器的开源代码 GitHub源码地址:功能强大的 FLV 文件分析和解析器 :可以将flv文件的视频tag中的h264类型数据和音频tag中的aac类型数据 ...

  4. 《最新开源 随插即用》SAM 自增强注意力深度解读与实践(附代码及分析)

    写在前面 大家好,我是cv君,前段时间忙碌工作,许久没更新,越发觉得对不起csdn的读者们,决定继续加油保持更新,保持一周2-3篇的高频率和高质量文章更新:论文分析.代码讲解.代码实操和训练.优化部署 ...

  5. MATLAB教室人数统计开源代码(包含 GUI 注释 课题分析)

    MATLAB教室人数统计(免费开源代码) 本人参考了很多的资料最后总结整出来的,如果能够该博客对你的学习有所帮助的话,希望大家可以帮我点个赞,本人是抱着学习的态度进行分享,大家如果能在我的基础上进行二 ...

  6. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研

    想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...

  7. 开源代码分析技巧之——打印调用逻辑

    开源代码分析技巧之--打印调用逻辑 在研究开源代码时,大家或许都有这样的感慨: (1)代码太庞大,少则几万行代码,多则几百万行代码,不知道如何入手: (2)相关的帮助文档有限,很难短时间内理清头绪: ...

  8. 开源代码分析研究 之 BugNet (2008年1月14日更新 第一章BugNet 简介 已完成)

    开源代码分析研究 之 BugNet  http://www.bugnetproject.com/ 写作目的:BugNet是一个不错的C#开源项目和我最近研究ASP.NET和AJAX的实现,非常的匹配, ...

  9. 开源代码分析技巧之四——国外技术社区提问

    开源代码分析技巧之四--国外技术社区提问 在分析源码的时候,我们或多或少都会遇到过技术瓶颈.如果不突破这个瓶颈,接下来的研究就无法继续进行.并且不止对自己是瓶颈.对团队人员.技术顾问.资深人士都没有很 ...

  10. B站视频开源代码flv.js的使用部署心得(代码案例应用)

    版权声明:本文为博主原创文章,未经博主允许不得转载.不经过允许copy,讲追究法律责任,欢迎加入我们的学习提升群466355109,可以相互交流 Flv.js 是 HTML5 Flash 视频(FLV ...

最新文章

  1. yii mysql数据库操作_Yii2数据库操作常用方法小结
  2. 算法每日练习之判断完数
  3. 为什么我们从Angular 2迁移到Vue.js(为什么我们没有选择React)
  4. HTTP 错误 500.19 - Internal Server Error v4.0.30319
  5. 使用Logtail采集Kubernetes上挂载的NAS日志
  6. 神的战争god无法显示服务器,神的战争god快速升级抢资源攻略
  7. 《Django实战系列》
  8. Informatica 简单使用
  9. Impala SQL 语言参考
  10. 编译器各个步骤的介绍
  11. 计算机网络驱动坏了怎么解决办法,网卡驱动异常怎么办_网卡驱动异常解决办法_飞翔教程...
  12. 编程之美读书笔记_1.4 买书问题
  13. QComboBox显示文本居中问题
  14. 论文阅读翻译笔记之Incentives build robustness in BitTorrent
  15. 最新emlog看板娘插件合集
  16. 笔记本电脑怎么打不开计算机,笔记本电脑打不开了怎么办
  17. python视频搬运_拒绝降权!教你用 Python 确保制作的短视频独一无二
  18. 【电子产品】ThinkPad S5 Intel R Dual Band Wireless-AC 3165 网卡驱动莫名
  19. (WPF)连锁超市收银系统总结
  20. 2的1000次方的各位之和是多少?

热门文章

  1. 在运行java程序时出现 Error: could not open c:\program Files\Java\jre6\lib\amd64\jvm.cfg'
  2. redis中以目录形式存储和读取数据
  3. windows彻底永久关闭自动更新的方式
  4. 前端的3D(css3版本)--淘宝造物节3D创景的制作
  5. 微信小商店购物组件接入现有的小程序,在开发者工具中使用
  6. Debian 7 源(32/64bit)好用的源
  7. C语言 单链表的反转
  8. android 平板 不支持apk,平板电脑上怎么无法打开apk文件
  9. BT技术原理(BitTorrent)
  10. 田野调查手记·浮山摩崖石刻(二)