=================================================================
音视频入门基础:FLV专题系列文章:
音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件
音视频入门基础:FLV专题(3)——FLV header简介
音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件
音视频入门基础:FLV专题(5)——FFmpeg源码中,判断某文件是否为FLV文件的实现
音视频入门基础:FLV专题(6)——FFmpeg源码中,解码FLV header的实现
音视频入门基础:FLV专题(7)——Tag header简介
音视频入门基础:FLV专题(8)——FFmpeg源码中,解码Tag header的实现
音视频入门基础:FLV专题(9)——Script Tag简介
音视频入门基础:FLV专题(10)——Script Tag实例分析
音视频入门基础:FLV专题(11)——FFmpeg源码中,解析SCRIPTDATASTRING类型的ScriptDataValue的实现
音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现
音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现
音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现
音视频入门基础:FLV专题(15)——Video Tag简介
音视频入门基础:FLV专题(16)——FFmpeg源码中,解码Video Tag的VideoTagHeader的实现
音视频入门基础:FLV专题(17)——FFmpeg源码中,提取Video Tag的VIDEODATA的实现
音视频入门基础:FLV专题(18)——Audio Tag简介
音视频入门基础:FLV专题(19)——FFmpeg源码中,解码Audio Tag的AudioTagHeader,并提取AUDIODATA的实现
音视频入门基础:FLV专题(20)——FFmpeg源码中,获取FLV文件major_brand、minor_version、compatible_brands、encoder、Duration的实现
音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)
音视频入门基础:FLV专题(22)——FFmpeg源码中,获取FLV文件音频信息的实现(中)
音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)
音视频入门基础:FLV专题(24)——FFmpeg源码中,获取FLV文件视频信息的实现
音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息
=================================================================
一、引言
从《音视频入门基础:FLV专题(9)——Script Tag简介》中可以知道,根据《video_file_format_spec_v10_1.pdf》第80到81页,SCRIPTDATAVALUE类型由一个8位(1字节)的Type和一个ScriptDataValue组成。其中Type属性用来指定ScriptDataValue的类型,根据Type值的不同,ScriptDataValue的类型也不同。当Type的值为0时,ScriptDataValue为DOUBLE类型:
根据《swf-file-format-spec.pdf》第16页,DOUBLE类型为IEEE-754双精度浮点数。存贮DOUBLE类型数据需要占用8个字节:
FFmpeg源码中通过av_int2double函数解析DOUBLE类型的ScriptDataValue。
二、av_int2double函数的定义
av_int2double函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavutil/intfloat.h中:
/**
* Reinterpret a 64-bit integer as a double.
*/
static av_always_inline double av_int2double(uint64_t i)
{
union av_intfloat64 v;
v.i = i;
return v.f;
}
该函数的作用是将64位整数重新解释为double类型。C、C++中使用到的双精度浮点数(double)类型是在IEEE二进制浮点数算术标准(IEEE-754)中定义的。双精度浮点数(Double)用来表示带有小数部分的实数,一般用于计算机编程中定义变量,占用8个字节存储空间。所以av_int2double函数的作用就是从内存中读取8个字节(形参i存贮的64位整数),将其转换为double类型返回。
形参i:输入型参数,需要被重新解释的64位整数。
返回值:转换得到的double类型数据。
联合体av_intfloat64声明在libavutil/intfloat.h中:
union av_intfloat64 {
uint64_t i;
double f;
};
三、av_int2double函数的实际用法
比如想要将下图红框中的64位数据“0x40 0x29 0xCC 0xCC 0xCC 0xCC 0xCC 0xCD”转换为double类型数据:
通过Windows自带的计算器可以算出“0x40 0x29 0xCC 0xCC 0xCC 0xCC 0xCC 0xCD”对应的十进制整数为:4623451672453893325:
执行语句:
double num_val = av_int2double(4623451672453893325);
num_val即可得到转换得到的double类型数据,即12.9。