梅麻吕 MP_文件简易转换工具

Umemaro3D

  昨天 尝试了一下 杉本女医の淫乱痴療,很蛋疼,不能直接用播放器播放,点得都手酸了,而且有点隐藏剧情得loop个5-10遍才能播放。于是乎在新年之际,搞了个这个小工具来转换,据贴吧@kakurukia说可以此方法可以用于Intou游戏Ω(前编)只能说是里面大部分,个别的识别的头不太一样,下面会在手工中贴出来,不过再之前是是否是如此的文件结构,还是大家自己去尝试下吧。

原理:
  梅麻吕的第十弹不能直接用播放器播放,影像文件为后缀为“mp”的文件。实际是格式是MPEG-PS的mpg文件,但是梅麻吕把文件分为了2部分(以下假设为A和B),原来mpg文件顺序为AB,但是mp的文件顺序却是BA。所以我们只要将顺序调转回来就能直接用播放器放。

手工方式:

  • 工具:WinHex

搜索 000001B9000001BA剪切文件头到000001B9这一块,粘贴到文件末尾
另存为.mpg文件,即可直接播放

000001B9为mpg结尾
000001BA为mpg开头

自动小软件

  为了欢度新年,我编了个小软件来转换,大家可以尝试。不保证所以版本都能行。

需要.net framework 2.0

http://dl.dbank.com/c058aaf773

操作方法

  将Movie文件夹下的”.mp_”全选,直接全部拖到此程序图标上面即可。

  mpg文件同样生成在Movie文件夹下。

已经发表在百度贴吧里面了:http://tieba.baidu.com/f?kz=966651885

代码

  同时正因为是新年所以把源码也一并附上,有兴趣的一起来研究( 注释掉的判断0xFF的循环有时候会出错 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
private static void ConvertMPG(String Input)
{
    FileStream MP_ = File.Open(Input, FileMode.Open);
    int ll=Input.Length;
    String Output = Input;
    Output=Output.Replace("mp_", "mpg");
    long length = MP_.Length;
    //偏移计数器
    int round = 0;
    long count=0;
    //MPG开始结尾标志
    int[] SearchHex = new int[] { 0x00, 0x00, 0x01, 0xB9, 0x00, 0x00, 0x01, 0xBA };
           //MPGStart = new int[] { 0x00, 0x00, 0x01, 0xBA },
           //  MPGEND = new int[] { 0x00, 0x00, 0x01, 0xBA };
    int tp;
    while(round<2)
    {
        if (count == length)
        {
            round++;
            SearchHex = new int[] { 0x00, 0x00, 0x01, 0xB7, 0x00, 0x00, 0x01, 0xB3 };
            count = 0;
            MP_.Seek(0, 0);
        }

        tp = MP_.ReadByte();
        count++;
        //if(tp==0xFF)
        //{
        //    tp = MP_.ReadByte();
        //    count++;
            if (tp == 0x00)
            {
                int[] btp = new int[8] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

                for (int i = 1; i < 8; i++)
                {
                    btp[i] = MP_.ReadByte();
                    count++;

                }
                if (CompareBt(btp, SearchHex))
                {
                    count = count - 4;
                    break;
                }
                else
                {
                    //此处为修正读取7位有个可能引起的Bug
                    count = count - 7;
                    MP_.Seek(-7, SeekOrigin.Current);
                }
            }

        //}

    }
    if (count != length)
    {
        byte[] bpart = new byte[count];
        byte[] apart = new byte[length - count];
        MP_.Seek(0, 0);
        MP_.Read(bpart, 0, bpart.Length);
        MP_.Read(apart, 0, apart.Length);
        MP_.Flush();
        if(File.Exists(Output))
        {
            File.Delete(Output);
        }
        FileStream MPG = File.Open(Output, FileMode.CreateNew);
        MPG.Write(apart, 0, apart.Length);
        MPG.Write(bpart, 0, bpart.Length);
        MPG.Flush();
        MPG.Close();
    }
    else
    {
        Console.WriteLine("不能被转换");
    }
}

/// <summary>
/// 比较两个数组是否相等
/// 
/// <param name="b1">数组1</param>
/// <param name="b2">数组2</param>
/// <returns>是否相等</returns>
private static bool CompareBt(int[] b1, int[] b2)
{
    if (b1.Length != b2.Length)
    { 
        return false; 
    }
    if (b1 == null || b2 == null)
    { 
        return false;
    }
    for (int i = 0; i < b1.Length; i++)
    {
        if (b1[i] != b2[i])
            return false;
    }
    return true;
}

Changelog

  • 2011-01-04

不能被转的文件也是这样的文件格式,不过头尾的16进制应该是000001B7000001B3

尾:000001B7
头:000001B3

处理方式也和上面一样,小工具就暂不更新了,我先得考试,虽然改下不用几分钟,但是我懒啊…结果我还是蛋疼的更新了小软件

赠品

改save方法(不完美)

  save文件中实际上用16进制的00表示没出现过01表示出现过,这样就简单了,直接全部改成01保存,就能查看几乎所以的视频

第十弹左边2个隐藏的不行…
左边2个的方法:http://new-umemaro3d.sakura.ne.jp/UmeTop-All.html
左边2个:红色字的播放个5次即可开启
右边2个:红色字的播放个10次即可开启