[2021开源大赛(第六届)] [分享源码] 取MP4帧宽度和帧高度(本地)
https://bbs.125.la/forum.php?mod=viewthread&tid=14707085
[易源码分享] [分享源码] 文件读写W版
https://bbs.125.la/forum.php?mod=viewthread&tid=14219684
之前取mp4的宽高是用的mediainfo.dll,因为取出的是所有元信息,所以我觉得取出的速度有点慢,我想找个取出快一点的方法。
去年番茄吧发了一个取MP4帧宽度和帧高度的帖子,我测试了一下,有几个问题:
1.不支持unicode路径。
2.不支持大文件。
3.由于mp4的编码方式也是五花八门,所以那个源码有一些mp4取不出来。
我根据那个源码,修复了以上的几个问题,源码如下。
其中支持的unicode路径和大文件读写是用的福仔的文件读写W版。
但是他这个W版也有一些问题,取文件长度和移动读写位置也就是GetFileSize和SetFilePointer没有采用EX版本,导致不能取和移动到长整数,
所以各位自己把这个文件读写W版里的GetFileSize和SetFilePointer替换成GetFileSizeEX和SetFilePointerEX就行了。
下面的_un命令就是修改了的福仔的文件读写W版。
关于定位mp4的“thkd”这个位置,由于对mp4格式研究不深,只知道这个thkd有时候在文件头,
有时候在文件尾,在文件尾的时候,具体在哪个位置,没法定位,只能用笨办法取文件尾的25000000字节,然后再搜索。
这样导致的问题就是读入这么一块字节集再搜索,速度就又慢下来了,所以如果遇到"thkd"在文件尾的,速度大概300ms/文件。
好在一些短视频的标准MP4文件,信息都在文件头,取出速度就会很快,十几ms左右。
这个源码只能取mp4,如果要取其他格式,还需要再研究,但是我觉得没必要,还是直接用mediainfo.dll方便,哈哈。
这是我研究的关于取mp4宽高的过程,虽然最后感觉没用上,但从研究的过程中也学到的很多东西,顺便也解决了福仔那个文件读写W版里的一些小问题。
变量名 | 类 型 | 静态 | 数组 | 备 注 | 文件号 | 整数型 | | | index | 长整数型 | | | 读写位置 | 长整数型 | | | bin | 字节集 | | | 帧宽度 | 长整数型 | | | 帧高度 | 长整数型 | | |
文件号 = 打开文件_un (MP4文件, #读入, #无限制 )bin = 读入字节集_un (文件号, 1000 )index = 寻找字节集 (bin, { 0, 0, 0, 92, 116, 107, 104, 100 }, )如果真 (index = -1 )index = 寻找字节集 (bin, 到字节集 (“free”), )如果真 (index = -1 )读写位置 = 取文件长度_un (文件号 ) - 25000000 移动读写位置_un (文件号, #文件首, 读写位置 )bin = 读入字节集_un (文件号, 25000000 )index = 寻找字节集 (bin, { 0, 0, 0, 92, 116, 107, 104, 100 }, )帧宽度 = 字节集转长整数 (取字节集中间 (bin, index + 84, 2 )) 帧高度 = 字节集转长整数 (取字节集中间 (bin, index + 88, 2 )) 如果真 (帧宽度 = 0 且 帧高度 = 0 )index = 寻找字节集 (bin, { 0, 0, 0, 92, 116, 107, 104, 100 }, index + 4 )帧宽度 = 字节集转长整数 (取字节集中间 (bin, index + 84, 2 )) 帧高度 = 字节集转长整数 (取字节集中间 (bin, index + 88, 2 )) 返回 (到文本 (帧宽度) + “×” + 到文本 (帧高度))index = index + 4读写位置 = 字节集转长整数 (取字节集中间 (bin, index, 4 )) 移动读写位置_un (文件号, #文件首, 读写位置 )bin = 读入字节集_un (文件号, 500 )index = 寻找字节集 (bin, { 0, 0, 0, 92, 116, 107, 104, 100 }, )帧宽度 = 字节集转长整数 (取字节集中间 (bin, index + 84, 2))帧高度 = 字节集转长整数 (取字节集中间 (bin, index + 88, 2 )) 如果真 (帧宽度 = 0 且 帧高度 = 0 )如果 (取文件长度_un (文件号 ) - 读写位置 - 300 < 25000000 )移动读写位置_un (文件号, #文件首, 读写位置 + 300 )bin = 读入字节集_un (文件号, 取文件长度_un (文件号 ) - 读写位置 - 300 )index = 寻找字节集 (bin, { 0, 0, 0, 92, 116, 107, 104, 100 }, )帧宽度 = 字节集转长整数 (取字节集中间 (bin, index + 84, 2 )) 帧高度 = 字节集转长整数 (取字节集中间 (bin, index + 88, 2 )) 读写位置 = 取文件长度_un (文件号 ) - 25000000 移动读写位置_un (文件号, #文件首, 读写位置 )bin = 读入字节集_un (文件号, 25000000 )index = 寻找字节集 (bin, { 0, 0, 0, 92, 116, 107, 104, 100 }, )帧宽度 = 字节集转长整数 (取字节集中间 (bin, index + 84, 2 )) 帧高度 = 字节集转长整数 (取字节集中间 (bin, index + 88, 2 )) 关闭文件_un (文件号)返回 (到文本 (帧宽度 ) + “×” + 到文本 (帧高度 ))
|