魔兽录像播放器3录像问题

从网上下了些,都是w3x格式的,结果在"观看录像"里找不到它们,这是为什么?w3g的可以找到。
我1.20和1.21两个版本都有;冰封王座和war3.exe都运行了,还是找不到。
高手给支个招吧,先谢谢了。
w3x不是录像,是冰封王座的地图,w3g的才是录像。w3x应放在Maps/ForzenThrone文件夹中。
其他答案(共4个回答)
再把它放到指定的文件夹Maps/ForzenThrone里面才行,记住,要是当时录象的比赛地图才行。
..播放魔兽录象要分两样.一个是录象文件.一个是地图文件.地图文件放在地图文件夹中.如澄海3C...录象文件放在录象文件夹中.就可以播放了
首先你要确认你的版本是多少的,这个很容易,游戏开始画面右下角有;其次你要确定对应版本是多少,这个不容易,不过一般市面上都差不多是1.20了,你可以在新浪或者游侠...
录象不能看的情况主要是:
1.地图位置不对,这是最常见的,你按照游戏提示给你的地图及位置进行操作,自己在地图目录中建立同名文件夹,并将指定地图放入即可
war3的录像不能跨越版本观看,可能考虑到是录像生成的纪录方式,每个版本中的代码不一样所致。
所以你要看哪个版本的录像就打哪个版本的补丁,或者你安装多个版本的...
■ 后缀为 W3X 的是 冰封王座(TFT) 的地图。
■ 后缀为 W3M 的是 混乱之治(ROC) 的地图。
■ 请放到 魔兽争霸Maps\Downloa...
在抗痘大战中,我屡战屡败,谁都介绍一款“抗痘神器”啊,实在受不了了,要崩溃了
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区4008人阅读
Java语言(54)
魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、中国的鬼王ted、刚猛的fly、飘逸的th000等选手。遗憾的是WCG2013是魔兽争霸3的最后一届,我自己也去现场观看了魔兽的总决赛。此外,还有DOTA、真三、澄海3C等著名的地图。
魔兽争霸的录像大家都知道,是用来回放的,文件后缀名是.w3g,保存在魔兽争霸下的REPLAY目录下。现在很多软件可以分析魔兽争霸录像,直接可以查看录像的玩家、地图,以及玩家的APM等信息。
最近在YY对战平台打魔兽,经常能遇到Java程序员,说明Java程序员中有很多魔兽争霸3的玩家,这里将Java解析魔兽争霸3录像的方法贡献给同是WAR3玩家的小伙伴们。
魔兽争霸3录像文件由一个头部(Header)和多个压缩数据块(compressed data blocks)组成。本文主要内容是解析Header部分,压缩数据块部分的解析会在后续的博文中详细介绍。
Header结构:
Header部分包含了录像的最基本的信息,大小是固定的前68个字节,此后的全部是压缩数据块。对于1.06版本及之前的录像,Header部分大小是64字节,由于版本太古老这里就不考虑了。下面的代码中也不再支持老版本的录像。
Header中每个部分的意义:
1~28字节(28个字符):固定的字符串&Warcraft III recorded game\0x1A\0&。
29~32字节(4个字节):Header部分的总字节数,对于1.07版本及之后,是68(0x44),对于1.06版本及之前是64(0x40)。
33~36字节(4个字节):压缩数据块的压缩数据总字节数,即解压前。
37~40字节(4个字节):录像版本标识(0表示1.06版本及之前版本,1表示1.07版本及之后版本)。
41~44字节(4个字节):压缩数据块解压缩后的总字节数。
45~48字节(4个字节):压缩数据块的个数。
49~52字节(4个字节):一个字符串标识,&WAR3&表示非冰封王座,&W3XP&表示冰封王座。
53~56字节(4个字节):版本号(例如24即是1.24版本)。
57~58字节(2个字节):构建号(build number)。
59~60字节(2个字节):0x0000表示单人游戏,0x8000(十进制32768)表示多人游戏。
61~64字节(4个字节):录像时长(毫秒数),需要注意的是,这个时长不包括游戏中暂停的时长。
65~68字节(4个字节):Header部分CRC32校验码(包含这四个字节但是要都设为0)。
可以使用EditPlus的Hex Viewer方式打开w3g文件查看Header部分。
在这里可以发现一个问题,除了第一个字符串&Warcraft III recorded game\0x1A\0&以外,其他每个部分的字节顺序都是倒过来的。例如Header部分总字节数是0x,&W3XP&字符串顺序是&PX3W&。这是因为这里使用的是小字节序(Little-Endian),也就是字节顺序和正常的顺序完全相反,所以在读取的时候应该将其倒过来读。
Java解析Header:
知道了Header部分的结构,下面就可以用Java语言来解析Header了。
首先定义一个Replay类,表示一场录像,构造函数传入录像文件File。为了方便,将文件转换成字节数组,再将字节数组传给Header类进行处理。
Replay.java
package com.xxg.w3
import java.io.ByteArrayOutputS
import java.io.F
import java.io.FileInputS
import java.io.IOE
public class Replay {
public Replay(File w3gFile) throws IOException, W3GException {
byte[] fileBytes = fileToByteArray(w3gFile);
header = new Header(fileBytes);
* 将文件转换成字节数组
* @param w3gFile 文件
* @return 字节数组
* @throws IOException
private byte[] fileToByteArray(File w3gFile) throws IOException {
FileInputStream fileInputStream = new FileInputStream(w3gFile);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while((n = fileInputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, n);
} finally {
fileInputStream.close();
return byteArrayOutputStream.toByteArray();
public Header getHeader() {
在Header类中,按小字节序读取所有的Header信息。Header的最后四个字节是CRC32循环冗余检验码,Java中可以使用java.util.zip.CRC32类来计算,下面的代码中校验了计算结果和Header中是否一致。有关CRC32的介绍可以查看相关资料,这里不再介绍。
Header.java
package com.xxg.w3
import java.util.zip.CRC32;
public class Header {
public static final String BEGIN_TITLE = &Warcraft III recorded game\u001A\0&;
private long headerS
private long compressedDataS
private long headerV
private long uncompressedDataS
private long compressedDataBlockC
private String versionI
private long versionN
private int buildN
public Header(byte[] fileBytes) throws W3GException {
// 读取开头的字符串&Warcraft III recorded game\u001A\0&
String beginTitle = new String(fileBytes, 0, 28);
System.out.println(&1-28字节:& + beginTitle);
if (!BEGIN_TITLE.equals(beginTitle)) {
throw new W3GException(&录像格式不正确。&);
// header部分总大小(版本小于或等于V1.06是0x40(64),版本大于或等于V1.07是0x44(68))
headerSize = LittleEndianTool.getUnsignedInt32(fileBytes, 28);
System.out.println(&29-32字节:& + headerSize);
if (headerSize != 0x44) {
throw new W3GException(&不支持V1.06及以下版本的录像。&);
// 压缩文件大小
compressedDataSize = LittleEndianTool.getUnsignedInt32(fileBytes, 32);
System.out.println(&33-36字节:& + compressedDataSize);
// header版本(版本小于或等于V1.06是0,版本大于或等于V1.07是1)
headerVersion = LittleEndianTool.getUnsignedInt32(fileBytes, 36);
System.out.println(&37-40字节:& + headerVersion);
if (headerVersion != 1) {
throw new W3GException(&不支持V1.06及以下版本的录像。&);
// 解压缩数据大小
uncompressedDataSize = LittleEndianTool.getUnsignedInt32(fileBytes, 40);
System.out.println(&41-44字节:& + uncompressedDataSize);
// 压缩数据块数量
compressedDataBlockCount = LittleEndianTool.getUnsignedInt32(fileBytes, 44);
System.out.println(&45-48字节:& + compressedDataBlockCount);
// WAR3:非冰封王座录像,W3XP冰封王座录像
versionIdentifier = LittleEndianTool.getString(fileBytes, 48, 4);
System.out.println(&49-52字节:& + versionIdentifier);
// 版本号(例如1.24版本对应的值是24)
versionNumber = LittleEndianTool.getUnsignedInt32(fileBytes, 52);
System.out.println(&53-56字节:& + versionNumber);
// Build号
buildNumber = LittleEndianTool.getUnsignedInt16(fileBytes, 56);
System.out.println(&57-58字节:& + buildNumber);
// 单人游戏(0x0000) 多人游戏(0x8000,对应十进制32768)
flag = LittleEndianTool.getUnsignedInt16(fileBytes, 58);
System.out.println(&59-60字节:& + flag);
// 录像时长(毫秒)
duration = LittleEndianTool.getUnsignedInt32(fileBytes, 60);
System.out.println(&61-64字节:& + duration);
// CRC32校验码
long crc32 = LittleEndianTool.getUnsignedInt32(fileBytes, 64);
System.out.println(&65-68字节:& + crc32);
// 这里来校验CRC32,将最后四位也就是CRC32所在的四个字节设为0后计算CRC32的值
CRC32 crc32Tool = new CRC32();
crc32Tool.update(fileBytes, 0, 64);
crc32Tool.update(0);
crc32Tool.update(0);
crc32Tool.update(0);
crc32Tool.update(0);
System.out.println(&计算CRC32:& + crc32Tool.getValue());
// 判断Header中后四位读取的CRC32的值和计算得到的值比较,看是否一致
if (crc32 != crc32Tool.getValue()) {
throw new W3GException(&Header部分CRC32校验不通过。&);
public long getHeaderSize() {
return headerS
public long getCompressedDataSize() {
return compressedDataS
public long getHeaderVersion() {
return headerV
public long getUncompressedDataSize() {
return uncompressedDataS
public long getCompressedDataBlockCount() {
return compressedDataBlockC
public String getVersionIdentifier() {
return versionI
public long getVersionNumber() {
return versionN
public int getBuildNumber() {
return buildN
public int getFlag() {
public long getDuration() {
Header中用到了LittleEndianTool是用来按小字节序读取数据的工具类。
LittleEndianTool.java
package com.xxg.w3
* Little-Endian(小字节序)工具类
* @author 叉叉哥()
public class LittleEndianTool {
* 以Little-Endian(小字节序)方式读取字节数组中的一个16位(2个字节)无符号整数
* @param bytes 字节数组
* @param offset 开始字节的位置索引
* @return 16位(2个字节)无符号整数
public static int getUnsignedInt16(byte[] bytes, int offset) {
int b0 = bytes[offset] & 0xFF;
int b1 = bytes[offset + 1] & 0xFF;
return b0 + (b1 && 8);
* 以Little-Endian(小字节序)方式读取字节数组中的一个32位(4个字节)无符号整数
* @param bytes 字节数组
* @param offset 开始字节的位置索引
* @return 32位(4个字节)无符号整数
public static long getUnsignedInt32(byte[] bytes, int offset) {
long b0 = bytes[offset] & 0xFFl;
long b1 = bytes[offset + 1] & 0xFFl;
long b2 = bytes[offset + 2] & 0xFFl;
long b3 = bytes[offset + 3] & 0xFFl;
return b0 + (b1 && 8) + (b2 && 16) + (b3 && 24);
* 以Little-Endian(小字节序)方式读取字节数组中的字符串
* @param bytes 字节数组
* @param offset 开始字节的位置索引
* @param length 需要读取的长度
* @return 读取的字符串
public static String getString(byte[] bytes, int offset, int length) {
byte[] temp = new byte[length];
for(int i = 0; i & i++) {
temp[i] = bytes[offset + length - i - 1];
return new String(temp);
这里需要注意的是,Java中int类型4个字节大小,但是由于是有符号的整数,补码的最高位是符号位,所以对于Header中的4个字节的无符号整数,必须要用long类型才足够。2个字节的无符号整数需要使用Java中的int而不能是short。
另外,Header中用到了W3GException异常。
W3GException.java
package com.xxg.w3
public class W3GException extends Exception {
public W3GException(String message) {
super(message);
最后用main方法调用这些代码来测试。
package com.xxg.w3
import java.io.F
import java.io.IOE
public class Test {
public static void main(String[] args) throws IOException, W3GException {
Replay replay = new Replay(new File(&E:/魔兽争霸3冰封王座/REPLAY/100729_[NE]EHOME.ReMinD_VS_[ORC]WemadeFOX_Lyn_EchoIsles_RN.w3g&));
Header header = replay.getHeader();
System.out.println(&WAR3录像基本信息为:&);
System.out.println(&版本:1.& + header.getVersionNumber() + &.& + header.getBuildNumber());
long duration = header.getDuration();
long second = (duration / 1000) % 60;
long minite = (duration / 1000) / 60;
if (second & 10) {
System.out.println(&时长:& + minite + &:0& + second);
System.out.println(&时长:& + minite + &:& + second);
输出结果:
1-28字节:Warcraft III recorded game &
29-32字节:68
33-36字节:125736
37-40字节:1
41-44字节:311296
45-48字节:38
49-52字节:W3XP
53-56字节:24
57-58字节:6059
59-60字节:32768
61-64字节:783600
65-68字节:
计算CRC32:
WAR3录像基本信息为:
版本:1.24.6059
时长:13:03
参考文档:
作者:叉叉哥 & 转载请注明出处:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:594602次
积分:6463
积分:6463
排名:第3461名
原创:87篇
评论:648条
文章:12篇
阅读:40230
(3)(4)(2)(2)(1)(1)(3)(1)(1)(1)(1)(2)(2)(1)(2)(3)(7)(3)(1)(2)(3)(2)(4)(2)(1)(5)(2)(1)(2)(4)(2)(1)(2)(3)(1)(7)(1)(2)魔兽争霸3录像分析 W3GMaster 1.9.9.105
投诉建议:
千万流量共享 百度高权重排名
软件大小: 479.0 KB
软件厂商:
软件语言: 简体中文
软件授权: 免费
软件评级:
应用平台:WinAll
更新时间:
编辑推荐:
W3GMaster是一款兽争霸3录像分析工具,可查看APM、批量改名、批量输出、查看聊天记录、查看操作列表。当然也可以配置改名规则,比如把日期放在最前面。
曲线图中可看APM(游戏时间折线图)、动作(如右建点了多少次)、英雄(数量、最终等级)、建筑、单位(总共造了多少单位)、科技(最终科技情况)的柱状或折线图。可点击&用游戏观看&和&显示地图&,前提是你安装了魔兽。从操作列表我们很容易看出一个人的高APM是真正的高还是狂点右键这种非操作累积起来的。特别是曲线图中,可以看到选手哪个时期AMP高,是前期开局,还是大战之时,达到高峰。看技术不能一味看AMP高低,这曲线图帮我们客观的了解了不少情况。
11MB|7MB|312MB|10MB|75MB|9MB|
聚超值推荐
今日更新推荐
软件分类目录
同类软件下载排行
热门关键词

我要回帖

更多关于 魔兽3录像 的文章

 

随机推荐