- 'Utilities for working with flv files'
- from __future__ import with_statement
- import array, struct
- def duration(header):
- 'Duration of flv file'
- i = header.index('duration') + len('duration')
- a = array.array('d')
- a.fromstring(header[i + 1:i + 9])
- a.byteswap()
- return a[0]
- def tag_value(text, tag, offset, length):
- 'Value of tag in text'
- i = text.index(tag) + len(tag) + offset
- return text[i:i + length]
- def decode_double(s):
- 'Double value from binary encoded string'
- a = array.array('d')
- a.fromstring(s)
- a.byteswap()
- return a[0]
- def replace(text, tag, offset, length, new):
- 'Replace value of tag in text with new (which must string)'
- i = text.index(tag) + len(tag)
- return text[:i + offset] + new + text[i + offset + length:]
- def header_body(flv_path):
- 'Tuple (header, body) of flv file without onMetaData tag'
- with open(flv_path, 'rb') as f:
- header = f.read(9)
- f.read(4)
- f.read(1)
- data_size = struct.unpack('>I', '/x00' + f.read(3))[0]
- f.read(7)
- f.read(data_size)
- body = f.read()
- return header, body
- def flv_header(f):
- 'First 9 bytes from file'
- return f.read(9)
- def skip_metadata(f):
- 'File position must be on previous tag size'
- result = ''
- f.read(4)
- result += f.read(1)
- size = f.read(3)
- result += size
- data_size = struct.unpack('>I', '/x00' + size)[0]
- result += f.read(7)
- return result + f.read(data_size)
- def flv_metadata(f):
- 'File position must be on previous tag size'
- return skip_metadata(f)
- def add_prev_size(tag, size):
- 'Replace previous tag size with size'
- return struct.pack('>I', size) + tag
- def previous_tag_size(f):
- return struct.unpack('>I', f.read(4))
- def tag_timestamp(tag):
- 'Timestamp value of in milliseconds'
- return struct.unpack('>I', '/x00' + tag[4:7])[0]
- def replace_timestamp(tag, timestamp):
- 'Replace timestamp in tag with new value'
- packed = struct.pack('>I', timestamp)[1:]
- return tag[:4] + packed + tag[7:]
- def simple_merge(out_path, *paths):
- 'Merge paths (which must be flv files) and write output to out_path'
- parsed = []
- files = [open(p, 'rb') for p in paths]
- header = flv_header(files[0])
- for f in files[1:]: flv_header(f)
- metadata = [flv_metadata(f) for f in files]
- total = 0
- for meta in metadata:
- total += duration(meta)
- metadata[0] = replace(metadata[0], 'duration', 1, 8, struct.pack('>d', total))
- with open(out_path, 'wb') as out:
- out.write(header)
- prev_size = 0
- offset = 0
- # uncomment next line if you want save metadata
- # out.write(add_prev_size(metadata[0], prev_size))
- for f in files:
- prev = previous_tag_size(f)
- for tag, size in tags(f):
- new_offset = tag_timestamp(tag)
- tag = replace_timestamp(tag, offset + new_offset)
- out.write(add_prev_size(tag, prev_size))
- prev_size = size
- prev = previous_tag_size(f)
- offset += new_offset
- def tags(flv, max_tags = -1):
- '''Generator yielding (tag, size) from flv stream. File position must be on
- tag type'''
- tag_type = flv.read(1)
- while tag_type and max_tags:
- basic_size = flv.read(3)
- data_size = struct.unpack('>I', '/x00' + basic_size)[0]
- buf = tag_type + basic_size
- buf += flv.read(7)
- buf += flv.read(data_size)
- #print(flv.tell())
- yield buf, data_size + 11
- tag_type = flv.read(1)
- max_tags -= 1
- import glob, os.path, re, tkFileDialog, tkMessageBox, webbrowser, sys
- def flv_files(directory):
- ''''List of flv files in directory sorted in right order
- (i.e part2 is before part10)'''
- lst = glob.glob(os.path.join(directory, '*.flv'))
- def right_cmp(x, y):
- xs = int(re.findall(r'/d+', x)[-1])
- ys = int(re.findall(r'/d+', y)[-1])
- return cmp(xs, ys)
- lst.sort(right_cmp)
- return lst
- if __name__ == '__main__':
- directory = tkFileDialog.askdirectory()
- if directory:
- out_file = os.path.join(os.path.dirname(directory),
- os.path.basename(directory) + '.flv')
- lst = flv_files(directory)
- if len(lst) == 0:
- tkMessageBox.showerror('Error', 'No flv files in %s' % directory)
- else:
- simple_merge(out_file, *lst)
- webbrowser.open(out_file)
相关推荐
FlvPlayer.rar
多功能flex视频源码,功能齐全能够播放多种格式
flv.js视频播放库基本用法
安装 npm install --save flv.js 基本用法 flvjs.createPlayer() 参数详细介绍 player对象源码 可查看有哪些方法和属性 若需要支持flv回放功能请使用 mpegts.js 假设存在一个 video 元素 <video id="videoElement"></video> 先检测浏览器是否支持 import flvjs from "flv.js" if (flvjs.isSupported()) { ... }
flv二进制数据解析工具(FlvParse)-已包含齐全的动态库
【该资源在win7——64位系统下验证通过。win10系统试试用win7兼容方式打开】 解析flv二进制数据的小工具,tag header tag data等都分析出来了的 这个工具的主要功能是查看FLV的文件结构,帮助我们理解FLV格式。另外,如果涉及到处理flv文件的开发,这个工具对于查看处理结果非常有帮助。因此我觉得有必要写一个使用说明,希望这个工具能够给大家提供帮助。 打开后的界面如下图所示。 先说一下界面布局:左上方是FLV文件的结构树,右边是FLV文件的字节流数据;左侧结构树下面依次是结构树的信息等级选择、高速模式选择、文件分析用时及进度条等;下方是分析文件的地址显示以及文件选择按钮。下面详细介绍一下相关部分。 结构树及信息等级 FLV结构树是这个工具最重要的显示信息,用户可以直观的查看当前FLV文件的结构。FLVParse默认FLV文件结构树的形式为:File Header + Metadata Tag(1个) + Video or Audio Tags(按顺序)。 结构树的信息详细程度是按等级划分的,之所以要分等级,是为了区分显示信息的详细程度,因为不同程度的分析对于分析所用的时间影响是比较大的(主要在UI界面上),越详细的信息等级占用分析时间越长。一共有6个等级,按从简单到详细介绍如下。 only section position info —— 只有每个section的位置信息,如下图所示。其中每个section后的方括号里是位置信息(十六进制表示),每个“Pre Tag Size”后面的数字表示size的大小(十进制表示),Video&Audio Tag按照在文件中的顺序依次排序标号; file header info, metadata info —— 只有File Header + Metadata Tag的详细信息,如下图所示。其中File Header的详细结构信息会在子树中列出,并在每项后面标示该项的值;Metadata Tag类似,包含Tag Header和Tag Data两个子树,并且对应子项的详细信息也都列出; file header info, metadata info, tag position info —— 包含File Header + Metadata Tag的详细信息,Video&Audio Tags的位置信息,以及Pre Tag Size信息,如下图所示; file header info, metadata info, tag section position info —— 比上个等级多出Video&Audio Tags的Tag Header和Tag Data的位置信息,如下图所示; file header info, metadata info, tag header info —— 比上个等级多出Tag Header的详细子项信息,如下图所示; file header info, metadata info, tag info —— 比上个等级多出Tag Data的详细子项信息,如下图所示。 FLV字节流数据显示 右侧显示了FLV文件的数据,可以让用户方便地查询对应位置上的字节。每一行都以一个十六进制的位置开始,该位置为相对于文件开头的位置。每一行有十六个字节,每个字节按高4位和第4位显示2个十六进制的字符,用户可以滑动滚动条查看任意位置的字节。 当用户选中左边结构树中的某项时,右边数据会自动选中对应的数据区域(绿色),根据不同项的类型,选中的区域大小也会自动对应。 高速模式 这个选项是为了解决分析比较大的FLV文件时,用户等待时间过长的问题。 普通模式时,分析过程为阻塞模式,即主线程分析完毕后刷新界面,用户才可以继续操作。 高速模式时,为非阻塞模式,主线程分析一小部分后立即返回刷新界面,响应用户操作;另外一个线程会继续分析剩余大部分文件,直到分析完毕自动结束线程。因此高速模式时,用户会看到结构树的滚动条一直在滑动,这是因为后台分析线程在不断向结构树里添加子项。需要注意的是,当后台分析线程还没有结束,如果用户打开新的文件进行分析,有可能出现错误的分析结果。这个目前没有进行测试,我想应该是这样的。 这里需要提一下,其实真正分析文件的时间并不会特别长,即使几百兆的文件,几十秒内应该没有问题,时间主要消耗在MFC的树型控件CTreeCtrl上。为了开发效率,FLVParse使用了MFC控件,但是CTreeCtrl在结构比较复杂,子项比较多的时候,效率会出现比较大的下降。当子项超过10000的时候,再进行添加的时间大大变长,几乎到了无法忍受的程度,好在还算稳定,没有出现崩溃等现象。粗略估计,每次分析文件,花在更新UI界面上的时间要占总耗时的90%以上,而且对于越大的
音视频基础(七)---FLV
FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。,在解析时需要注意。
【LaTex】LaTex的下载与安装(2025新手小白超详细、超简洁 Windows系统)
安装地点(1)texlive的安装:首先打开下载好的安装包,找到这个文件前面缺少了一页emm我去截取其他人的作为示范然后点击安装安装时间较久,大概要一个小时左右。具体要看个人电脑性能情况。如图显示如上图,则安装成功。图中是TeXstudio 4.8.7版本针对不同操作系统和使用场景的安装包 ,区别如下:(按需求下载)
DirectX修复工具使用技巧之二——手动修复C++创建失败的文件
最后更新:2021-2-25 随着V4.0正式版的发布,近来有部分用户来咨询如何解决C++文件创建失败的问题。在此我将以解决最常见的C++2015-2019文件创建失败为例,向大家演示一下在线修复的方法,其他C++或文件的方法大同小异。此次操作以Windows 7为例,其他系统相应参考即可。 首先,如果希望程序能手动在线修复创建失败的失败,请首先确定您使用的V4.0.2版或更高版本,老版本不支持此功能。查看程序版本的方式可以把鼠标放在DirectX Repair.e...
flv.js 使用说明
flv.js是一个基于 HTML5 Video 标签和 Media Source Extensions(MSE)实现的纯 JavaScript FLV 视频播放库。它允许用户在浏览器中直接播放 FLV 格式的视频,而不需要安装额外的插件。该库的目标是提供一个轻量、易用且功能强大的解决方案来处理 FLV 视频。flv.js的核心原理是利用 MSE API 将 FLV 流分段加载并传递给 Video 标签。
ABAQUS中CDP模型在钢筋混凝土节点低周反复荷载模拟的关键技术解析
本文深入解析了ABAQUS中CDP模型在钢筋混凝土节点低周反复荷载模拟中的关键技术。通过详细介绍CDP模型的核心价值、建模关键技术、滞回曲线优化方法及典型问题排查指南,帮助工程师精准模拟混凝土的拉伸开裂和压缩压碎行为,提升抗震分析效率。文章还提供了实用的工程应用技巧,如快速建模模板和后处理自动化脚本。
FLV 格式详解资料整理,关键帧格式解析写入库等等
理解一个格式,最好的方式就是用 Java 写个解析转换库。我将之转换为 Java ,添加写入关键帧索引的功能,一切竟然如此简单,宛若拨云见月。
把 ABAP ALV 表头做成两层分组:用 TOP-OF-PAGE 手工绘制双行列标题
摘要:本文介绍了在SAP ALV List中实现双层表头的方法。通过关闭系统默认列标题(no_colhead='X'),在TOP_OF_PAGE事件中手动绘制表头,使用sy-uline和sy-vline绘制线条实现分组效果。关键点包括:1)关闭系统表头;2)在事件处理中分两行输出分组标题和字段名;3)利用系统自动拼接线条的特性绘制表格边框。文中还指出了常见问题如线条自动粘连、颜色不生效等,并提供了完整示例代码和详细解释。这种方法适用于需要对字段进行业务分组的报表场景。
Dify之八添加各种在线大模型
Dify之八添加各种在线大模型
2016年11月12个轻量级的JavaScript库
1. meSing.js meSing.js是一个一个JavaScript歌唱合成库,它使用Web Audio API的DSP功能与meSpeak.js语音合成库结合,为Web提供声乐合成器。 2. Flv.js flv.js是一个 HTML5 Flash Video (FLV)播放器 采用纯JavaScript编写没有Flash。flv.js通过将FLV文件流传输到ISO BMFF(F...
ccSwitch 安装使用指南,claude code的最佳搭档
ccSwitch 是一款真正为 AI 编程开发者打造的效率工具。它把原本繁琐的配置管理工作,简化成了直观的图形界面操作。无论你是需要在多个 API 提供商之间切换,还是想要统一管理多款 AI 编程工具,ccSwitch 都能帮你大幅提升效率。如果你是重度 AI 编程工具用户,强烈推荐尝试一下 ccSwitch,相信它会成为你开发工具箱中不可或缺的一员。项目地址。
js框架或者库
使用 flv.js 做直播 flv.js 是来自 Bilibli 的开源项目。它解析 FLV 文件喂给原生 HTML5 Video 标签播放音视频数据,使浏览器在不借助 Flash 的情况下播放 FLV 成为可能。 unicorn.js - 一个 JavaScript 实现的开源 CPU 模拟器 在浏览器里运行 ARM/MIPS/SPAR...
遇到问题--OpenClaw--API rate limit reached. Please try again later429 您的账户已达到速率限制,请您控制请求频率
OpenClaw调用glm-4.7-flash模型时触发智谱AI平台429速率限制错误。分析发现当前重试策略采用固定间隔(7-11秒)导致连续失败,且未记录关键响应头信息。解决方案分三步:1)开启响应头日志获取配额详情;2)将重试策略改为带抖动的指数退避(初始1秒,最大60秒);3)在网关层实现令牌桶限流主动控制请求频率。需特别注意令牌配额(TPM)可能比请求次数(RPM)更早触达限制。
PCL 基于法向距离的对应点获取
提出了一种基于法向量欧氏距离的点云配准方法。详细推导了法向量距离计算公式,并给出具体计算流程。在代码实现部分,采用PCL库完成了点云法向量计算和对应关系估计,通过可视化验证了算法有效性。实验结果表明,该方法能够准确获取点云间的对应关系,为后续点云配准奠定了基础。
12 个轻量级的 JavaScript 库
1. meSing.js meSing.js是一个一个JavaScript歌唱合成库,它使用Web Audio API的DSP功能与meSpeak.js语音合成库结合,为Web提供声乐合成器。 2. Flv.js flv.js是一个 HTML5 Flash Video (FLV)播放器 采用纯JavaScript编写没有Flash。flv.js通过将FLV文件流传输
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
10个常用的JS工具库,80%的项目都在用
Day.js 一个极简的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持一样, 但体积仅有2KB。 npm install dayjs 基本用法 importdayjsfrom'dayjs' dayjs().format('YYYY-MM-DDHH:mm')//=>2022-01-0315:06 dayjs('2022-1-315:06').toDate()//=>MonJan03202215:06:00GM...
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
推荐轻量高效无依赖的开源JS插件和库
在这里维持一个持续更新的地方 图片 baguetteBox.js - 是一个简单易用的响应式图像灯箱效果脚本。demo Lightgallery.js - 是一个功能齐全的JavaScript图像灯箱插件。demo viewerjs - 是一个图像预览插件。demo cropperjs - 是一个图片编辑器插件。demo photo-e...
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
Java处理MP3资料
Java处理MP3资料 2012-05-03 13:16:18| 分类: Java | 标签:java mp3 解析 |字号 订阅 用JAVA编写MP3解码器系列 开源项目(总结自Java开源大全): 解码转换 Xuggler http://www.xuggle.com/xuggler/ , 项目当前版
java mp3 处理_Java处理MP3资料
解码转换Xugglerhttp://www.xuggle.com/xuggler/ , 项目当前版本5.4,持续更新中。Xuggler提供了利用Java来解压缩,修改和重新压缩任何媒体或流文件的最简单方式。支持Maven,对不同的平台有不同的分发包,但也有一个大包类库,包含全部系统类库.JLayerhttp://www.javazoom.net/javalayer/javalayer.html...
3大核心方案!ZLMediaKit Android平台WebRTC编译问题深度解析与解决方案
你是否在Android平台集成ZLMediaKit的WebRTC功能时遭遇编译失败?本文将系统梳理JNI接口不兼容、NDK版本冲突、WebRTC依赖缺失三大核心问题,提供经过验证的分步解决方案,帮助开发者2小时内完成环境配置与编译验证。 ## 编译环境基础配置 Android平台编译需使用项目提供的Gradle构建脚本,通过以下命令初始化编译环境: ```bash cd Android &&...
处理MP3相关工具包
解码转换 Xuggler http://www.xuggle.com/xuggler/ , 项目当前版本5.4,持续更新中。 Xuggler提供了利用Java来解压缩,修改和重新压缩任何媒体或流文件的最简单方式。 支持Maven,对不同的平台有不同的分发包,但也有一个大包类库,包含全部系统类库. JLayer http://www.javazoom.net/ja...
告别Flash!用ffmpeg+Node.js实现海康摄像头无插件直播(2023最新版)
本文详细介绍了2023年基于FFmpeg与Node.js实现海康摄像头无插件直播的最新方案。通过RTSP流转HLS技术,实现低延迟、跨平台的网页播放,特别适用于海康、大华等主流品牌摄像头,解决了传统Flash方案的安全和兼容性问题。
音视频学习(十三)——flv详解
flv详解
9923



被折叠的 条评论
为什么被折叠?



