本帖最后由 TBit 于 2022-10-13 11:53 编辑
1.在问答区看到一篇帖子 获取flv网络视频时长
问答贴: https://bbs.125.la/thread-14749691-1-1.html
论坛中只有MP4的时长获取
也有通过读取前几百个字节 再使用ffmpeg来获取时长 虽然也能达到目的 但还需要带个ffmpeg 就很不方便
遂通过解析flv协yi 了解组成部分后成功获取时长 下面分享一下过程
2.flv格式解析
网上有很多关于flv格式解析的博客 可自行翻阅 下面列出本贴需要的部分
onMetaData中包含了音视频相关的元数据,封装在Script Data Tag中,它包含了两个AMF。
第一个AMF:
- 第1个字节:0x02,表示字符串类型
- 第2-3个字节:UI16类型,值为0x000A,表示字符串的长度为10(onMetaData的长度);
- 第4-13个字节:字符串onMetaData对应的16进制数字(0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61);
第二个AMF:
- 第1个字节:0x08,表示数组类型;
- 第2-5个字节:UI32类型,表示数组的长度,onMetaData中具体包含哪些属性是不固定的。
- 第6个字节+:比如duration,则:
- 第6-9个字节:0x0008,表示长度为8个字节;
- 第10-17个字节:0x6475 7261 7469,表示 duration 这个字符串;
- 第18个字节:0x00,表示为数值类型;
- 第19-26个字节:0x...,表示具体的时长;
更多onMetaData字段的定义:
字段 |
字段类型 |
字段含义 |
duration |
DOUBLE |
文件的时长 |
width |
DOUBLE |
视频宽度(px) |
height |
DOUBLE |
视频高度(px) |
videodatarate |
DOUBLE |
视频比特率(kb/s) |
framerate |
DOUBLE |
视频帧率(帧/s) |
videocodecid |
DOUBLE |
视频编解码器ID(参考Video Tag) |
audiosamplerate |
DOUBLE |
音频采样率 |
audiosamplesize |
DOUBLE |
音频采样精度(参考Audio Tag) |
stereo |
BOOL |
是否立体声 |
audiocodecid |
DOUBLE |
音频编解码器ID(参考Audio Tag) |
filesize |
DOUBLE |
文件总得大小(字节) |
00 08 64 75 72 61 74 69 6F 6E 00 40 A7 5D 1E B8 51 EB 85
08表示8个字节
64 75 72 61 74 69 6F 6E 表示duration文字
上面选中部分则就是具体的时长
由于 duration 是双浮点数据类型
所以要将这个十六进制转成双浮点即可获取正确的时长
十六进制转双浮点 参考帖子: https://bbs.125.la/forum.php?mod=redirect&goto=findpost&ptid=14699389&pid=22022452
解析部分参考博客: https://www.cnblogs.com/chyingp/p/flv-getting-started.html
源码很简单 大佬勿喷 调用了精易模块 自行引用即可 希望本贴能帮助到你们
获取网络flv时长.e
(142.98 KB, 下载次数: 56)
|