Adobe AMF3 规范详解

5星 · 超过95%的资源 需积分: 10 4 下载量 77 浏览量 更新于2024-09-14 收藏 97KB PDF 举报
"Adobe AMF3规范,发布于121207,是Adobe Systems Incorporated的一个格式,主要用于ActionScript对象图的序列化。" AMF3(Action Message Format Version 3)是由Adobe Systems开发的一种高效的二进制序列化格式,主要用于在ActionScript环境中将对象图转化为可存储或传输的格式。ActionScript是一种广泛应用于Flash和Flex应用中的脚本语言。AMF允许开发者将应用程序的公共状态在不同会话间持久化,或者在两个通信端点之间交换强类型的数据。 自2001年Flash Player 6引入AMF以来,这一格式在ActionScript 2.0(在Flash Player 7中)和Flash Player 8中保持不变,被称为AMF0。AMF0的设计是为了适应早期ActionScript的特性。然而,随着2006年Flash Player 9的发布,ActionScript 3.0和新的ActionScript虚拟机(AVM+)一同到来,引入了新的数据类型和语言特性。这些改进促使AMF进行了升级,以更好地支持AS3的高级功能。 AMF3作为AMF0的更新版本,针对编码格式进行了优化,移除了序列化过程中不必要的冗余信息,从而提高了数据传输的效率和解析速度。AMF3在序列化和反序列化过程中,能够更有效地处理ActionScript 3.0中的复杂对象结构,包括数组、对象、日期、XML、以及各种基本数据类型。 在AMF3中,数据被编码为不同的类型标记,以便接收方可以正确地解码和解释接收到的数据。例如,AMF3支持如下类型: 1. Number:双精度浮点数。 2. String:可变长度的UTF-8字符串。 3. Boolean:布尔值,True或False。 4. Null:表示null值。 5. Object:ActionScript 3.0的对象,包括其属性和方法。 6. Array:动态数组,可以包含不同类型的元素。 7. Date:日期和时间对象。 8. XML:XML文档。 9. ByteArray:字节数组,用于存储原始二进制数据。 10. Undefined:未定义,表示没有赋值的状态。 AMF3还支持自定义类的序列化,允许开发者指定如何将自定义对象转换为AMF格式,以便在网络上传输或存储。此外,AMF3在性能上优于AMF0,因为它可以更紧凑地编码数据,减少网络传输的负载。 总而言之,AMF3是ActionScript 3.0生态系统中的一个重要组成部分,它提供了一种高效、灵活且类型安全的数据交换机制,促进了跨平台的富互联网应用程序(RIA)的开发和交互。无论是对于服务器与客户端间的通信,还是在本地存储和恢复应用状态,AMF3都扮演着关键角色。

//function: create_flv_file //purpose: 创建一个FLV文件,并返回其句柄 //input: // [IN] const char *path: 文件完整路径 // [IN] double width: 视频宽 // [IN] double height: 视频高 // [IN] int32_t video: 是否有视频 // [IN] int32_t audio: 是否有音频 //output: // 返回文件句柄,若创建失败,则返回NULL FILE *create_flv_file(const char *path, double width, double height, int32_t video, int32_t audio) { FlvHeader header; MetaTagHeader meta_header; MetaTagData meta_data; char buf[3] = "\x00"; uint32_t size = 0; FILE *fd = fopen(path, "wb"); if(!fd) return NULL; //写FLV文件头 memcpy(header.flag, "FLV", 3); header.ver = 0x01; if(video == 1) header.content = 0x01; //只有视频 else if(audio == 1) header.content = 0x04; //只有音频 header.header_size = htonl(9); header.tag_size = 0x00000000; fwrite(&header, sizeof(char), sizeof(header), fd); if(video == 1) { //写FLV文件ScriptTag meta_header.type = 0x12; write_size(buf, 51); memcpy(meta_header.data_size, buf, 3); meta_header.timestamp = 0; memset(&meta_header.stream, '\x00', 3); fwrite(&meta_header, sizeof(char), sizeof(meta_header), fd); //写FLV文件Metatagdata meta_data.amf1_type = 0x02; meta_data.string_size = htons(10); memcpy(meta_data.string1, "onMetaData", 10); meta_data.amf2_type = 0x08; meta_data.array_size = htonl(2); fwrite(&meta_data, sizeof(char), sizeof(meta_data), fd); size += write_number(fd, strlen("width"), "width", width); size += write_number(fd, strlen("height"), "height", height); size = htonl(62); fwrite(&size, sizeof(char), 4, fd); } return fd; } 这个代码中有什么问题

2023-07-08 上传