Adobe AMF3 规范概述

需积分: 10 6 下载量 98 浏览量 更新于2024-12-04 收藏 91KB PDF 举报
"AMF3规范文档" AMF3(Action Message Format Version 3)是由Adobe Systems Incorporated开发的一种高效、二进制的序列化格式,它主要用于将ActionScript对象图转换成可存储或传输的格式。AMF使得应用程序能够在不同会话之间持久化和恢复其公共状态,或者通过交换强类型数据在两个端点之间进行通信。这个技术最早在2001年的Flash Player 6中引入,并在后续的ActionScript 2.0(Flash Player 7)和Flash Player 8中保持不变,当时被称为AMF0。 随着Flash Player 9的发布,ActionScript 3.0随之登场,这带来了全新的ActionScript虚拟机(AVM+)。ActionScript 3.0的语言特性和新的数据类型促使AMF需要进行升级以适应这些变化。因此,AMF3应运而生,它在AMF0的基础上进行了优化,去除了序列化过程中冗余的信息,提高了数据编码的效率。 AMF3的主要特点包括: 1. **二进制格式**:与AMF0的文本格式相比,AMF3使用二进制编码,数据传输更紧凑,解析速度更快。 2. **类型标记**:每个AMF3对象都包含一个类型标记,用于指示数据的类型,如Number、Boolean、String、Date、Array等,这允许快速识别和处理不同类型的值。 3. **优化的对象表示**:AMF3能更有效地表示ActionScript 3.0中的复杂数据结构,如Object和Array,减少了内存占用和序列化/反序列化的开销。 4. **压缩支持**:AMF3支持对序列化数据进行GZIP或DEFLATE压缩,进一步减小了网络传输的数据量。 5. **元数据支持**:AMF3可以携带有关序列化对象的元数据,如类名,允许在解码时正确地还原对象实例。 6. **自定义类型支持**:AMF3允许开发者注册自定义类型,以便在序列化和反序列化过程中正确处理它们。 AMF3在Web服务和实时通信(如RTMP)中广泛使用,特别是在Flex和Flash开发中。它提供了一种快速、高效的跨平台数据交换机制,尤其是在需要大量数据交换的场景下,比如视频流、游戏数据和实时交互应用。 然而,AMF3的缺点是它不是一种开放标准,而是Adobe专有的,这可能导致跨平台兼容性问题。此外,由于其二进制性质,调试AMF3序列化数据可能比调试文本格式(如JSON)更为困难。 AMF3是Adobe为了提高ActionScript应用程序数据交换效率而设计的一种高效序列化格式,它在ActionScript 3.0时代对AMF0进行了显著的优化和增强,但同时也带来了一些封闭性和调试挑战。

//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 上传