FLV合并开源代码flvmerge分析
项目的代码位于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分析相关推荐
- git合并丢失代码问题分析与解决
git合并丢失代码问题分析与解决(错误操作导致) git revert后导致合并代码丢失 起因 我有一个开发分支antd3.x和一个主分支develop,我在合并antd3.x到develop的时候发 ...
- 开源代码分析技巧之三——老外如是说
开源代码分析技巧之三--老外如是说 继续从深入分析开源代码说起,当然源码分析没有太多捷径可走.笔者只是探讨下,如何分析会更好些.特通过Samba技术邮件群组,向老外提问"如何更好的分析Sam ...
- 分析FLV文件分析和解析器的开源代码
分析一下GitHub上一份FLV文件分析和解析器的开源代码 GitHub源码地址:功能强大的 FLV 文件分析和解析器 :可以将flv文件的视频tag中的h264类型数据和音频tag中的aac类型数据 ...
- 《最新开源 随插即用》SAM 自增强注意力深度解读与实践(附代码及分析)
写在前面 大家好,我是cv君,前段时间忙碌工作,许久没更新,越发觉得对不起csdn的读者们,决定继续加油保持更新,保持一周2-3篇的高频率和高质量文章更新:论文分析.代码讲解.代码实操和训练.优化部署 ...
- MATLAB教室人数统计开源代码(包含 GUI 注释 课题分析)
MATLAB教室人数统计(免费开源代码) 本人参考了很多的资料最后总结整出来的,如果能够该博客对你的学习有所帮助的话,希望大家可以帮我点个赞,本人是抱着学习的态度进行分享,大家如果能在我的基础上进行二 ...
- 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...
- 开源代码分析技巧之——打印调用逻辑
开源代码分析技巧之--打印调用逻辑 在研究开源代码时,大家或许都有这样的感慨: (1)代码太庞大,少则几万行代码,多则几百万行代码,不知道如何入手: (2)相关的帮助文档有限,很难短时间内理清头绪: ...
- 开源代码分析研究 之 BugNet (2008年1月14日更新 第一章BugNet 简介 已完成)
开源代码分析研究 之 BugNet http://www.bugnetproject.com/ 写作目的:BugNet是一个不错的C#开源项目和我最近研究ASP.NET和AJAX的实现,非常的匹配, ...
- 开源代码分析技巧之四——国外技术社区提问
开源代码分析技巧之四--国外技术社区提问 在分析源码的时候,我们或多或少都会遇到过技术瓶颈.如果不突破这个瓶颈,接下来的研究就无法继续进行.并且不止对自己是瓶颈.对团队人员.技术顾问.资深人士都没有很 ...
- B站视频开源代码flv.js的使用部署心得(代码案例应用)
版权声明:本文为博主原创文章,未经博主允许不得转载.不经过允许copy,讲追究法律责任,欢迎加入我们的学习提升群466355109,可以相互交流 Flv.js 是 HTML5 Flash 视频(FLV ...
最新文章
- yii mysql数据库操作_Yii2数据库操作常用方法小结
- 算法每日练习之判断完数
- 为什么我们从Angular 2迁移到Vue.js(为什么我们没有选择React)
- HTTP 错误 500.19 - Internal Server Error v4.0.30319
- 使用Logtail采集Kubernetes上挂载的NAS日志
- 神的战争god无法显示服务器,神的战争god快速升级抢资源攻略
- 《Django实战系列》
- Informatica 简单使用
- Impala SQL 语言参考
- 编译器各个步骤的介绍
- 计算机网络驱动坏了怎么解决办法,网卡驱动异常怎么办_网卡驱动异常解决办法_飞翔教程...
- 编程之美读书笔记_1.4 买书问题
- QComboBox显示文本居中问题
- 论文阅读翻译笔记之Incentives build robustness in BitTorrent
- 最新emlog看板娘插件合集
- 笔记本电脑怎么打不开计算机,笔记本电脑打不开了怎么办
- python视频搬运_拒绝降权!教你用 Python 确保制作的短视频独一无二
- 【电子产品】ThinkPad S5 Intel R Dual Band Wireless-AC 3165 网卡驱动莫名
- (WPF)连锁超市收银系统总结
- 2的1000次方的各位之和是多少?
热门文章
- 在运行java程序时出现 Error: could not open c:\program Files\Java\jre6\lib\amd64\jvm.cfg'
- redis中以目录形式存储和读取数据
- windows彻底永久关闭自动更新的方式
- 前端的3D(css3版本)--淘宝造物节3D创景的制作
- 微信小商店购物组件接入现有的小程序,在开发者工具中使用
- Debian 7 源(32/64bit)好用的源
- C语言 单链表的反转
- android 平板 不支持apk,平板电脑上怎么无法打开apk文件
- BT技术原理(BitTorrent)
- 田野调查手记·浮山摩崖石刻(二)