trec-cursor.psm1

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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
<#
TREC使用的是mp4容器,其中添加了几个自定义box
TSCR标识了camtasia版本信息
TSCM包含光标,光标轨迹,slide标题,等信息
#>

<#
tscm有十二个'DATA'块依次是:
recordingRegion.dat
cursorLocation.dat
cursorAction.dat
keyboard.dat
foregroundWnd.dat
caret.dat
misc.dat
cursorImages.dat
cursorOpacity.dat
slideComments.dat
slideTitles.dat
slideText.dat
#>


<#
.SYNOPSIS
    从trec文件中导出tscm box
.DESCRIPTION
    trec文件是个mp4容器,这个脚本可以提取其中的tscm分段,它包含了光标和光标位置,鼠标点击,按键等信息
.EXAMPLE
    PS C:\> export-Tscm -path 'dds\dd.trec'
    export-Tscm -path [文件路径]
.INPUTS
    Inputs (if any)
.OUTPUTS
    Output (if any)
.NOTES
    这是一个对techsmith公司camtasia软件生成的trec格式录像文件中的光标文件进行替换的脚本
#>

function export-Tscm {
    #导出tscm
    [CmdletBinding()]
    param(
        # trec path
        [Parameter(Mandatory = $true, HelpMessage = "输入文件路径: c:xxx.trec")]
        [string]
        $path
    )

    if ($path -match '\.trec') {
        $new = $path -replace '\.trec$'
        &  "$PSScriptRoot/tool/mp4extract.exe" TSCM $path "$new.tscm"

    }
    else { "路径错误" }


}



function import-trec {
    #tscm回写到trec
    [CmdletBinding()]
    param (
        # 文件路径
        [Parameter(Mandatory = $true, HelpMessage = "输入文件路径: c:xxx.trec")]
        [string]
        $path        
    )

    #$path = "C:\Users\he123\Desktop\trecRec\cs_recording.trec"
    if ($path -notmatch '\.trec$') { '路径错误'; break }

    $new = $path -replace '(\.trec)', '.1$1'
    $path3 = $path -replace '(\.trec)', '.tscm'
    if(test-path $new ){$null=Remove-item -Path $new -Force}
    new-item -Path $new -ItemType File
    $write = [System.IO.File]::Open($new, [ System.IO.FileMode]::Open)
    $open = [System.IO.File]::Open($path, [ System.IO.FileMode]::Open)
    $tscm = [System.IO.File]::ReadAllBytes($path3)
    $duan = 0
    $size = 1mb
    $length = $size
    $th = $length
    $read = 1
    $len = 0
    while ($read) {
        $cha = $open.Length - $len
        if ($cha -lt $length) {
            $length = $cha
        }
        $byte = [byte[]]0 * $length
        $len += $open.Read($byte, 0, $length)
        $debug = [System.BitConverter]::ToString($byte).replace('-', '') 
        $debug = ($debug | Select-String -Pattern '0{6}015453434d').Matches.Index 
        if ($debug) {
            $end = $len - $length + $debug / 2
            $open.Position = 0

            while ($read) {
                $e = $end - $duan 
                if ($e -lt $size) {
                    $th = $e
                    $read = 0
                }
                $byte = [byte[]]0 * $th
                $duan += $open.Read($byte, 0, $th)
                $write.Write($byte, 0, $th)
            }
        }

    }
    $write.Write($tscm, 0, $tscm.Length)

    $open.Close()
    $write.Close()

    <#
.SYNOPSIS
    tscm回写到trec
.DESCRIPTION
    将tscm文件和原trec文件合称为新文件
.EXAMPLE
    PS C:\> import-trec -path "c:\xxx.trec"
.NOTES
    这是一个对techsmith公司camtasia软件生成的trec格式录像文件中的光标文件进行替换的脚本
#>

}



function import-Tscm {
    #tscm图片回写
    [CmdletBinding()]
    param (
        # Parameter help description
        [Parameter(Mandatory = $true, HelpMessage = "输入文件路径,例如: c:\xxx.tscm")]
        [string]
        $path        
    )
    
    if ($path -notmatch '\.tscm$') { '路径错误'; break }
    $read = [System.IO.File]::ReadAllBytes("$path");
    $tscmhex = [System.BitConverter]::ToString($read).replace('-','')
    $new = split-path $path

    #$json = Get-Content -path "$new\config.json" -Encoding utf8 | ConvertFrom-Json
    $csv = Get-Content -path "$new\config.csv" -Encoding utf8 | ConvertFrom-csv
    $csv | ForEach-Object {
        $png = $new + '\' + $_.'Number' + '.png'
        $gd = [System.IO.File]::ReadAllBytes("$png");
        $pnghex = [System.BitConverter]::ToString($gd).replace('-','')
        if ($pnghex -notlike $_.image) {
            "修改图片$( $_.'Number')"
            $leng = $pnghex.Length / 2 - $_.imagelength + $_.length
            $dao = (($leng -as [int]).ToString('X4') -split '(?<=^.{2})')[1..0] -join ''
            $x = (($_.x -as [int]).ToString('X4') -split '(?<=^.{2})')[1..0] -join ''
            $y = (($_.y -as [int]).ToString('X4') -split '(?<=^.{2})')[1..0] -join ''

            $image = $($_.image)
            
            $string = "$dao" + '0000' + $x + '0000' + "$y" + '0000' + "$pnghex"
            $tscmhex = $tscmhex -replace ".{24}$image", $string
        }
    }
    #
    $conv = $tscmhex | Select-String -Pattern '015453434d0{8}(.{8})' -AllMatches
    $yuanchang = [convert]::ToString('0x' + $conv.Matches.groups.Value[1], 10)
    $zonglength = $tscmhex.length / 2
    if ($yuanchang -eq $zonglength) {
        write-host "文件没有改变"
    }
    else {
        $zonglength = ($zonglength).ToString('X8')
        $tscmhex = $tscmhex -replace '(015453434d0{8}).{8}', "`${1}$zonglength"
        [system.io.file]::WriteAllBytes("$path", $([byte[]] -split ($tscmhex -replace '..', '0x$& ') ))
    }

    <#
.SYNOPSIS
    tscm图片回写
.DESCRIPTION
    将修改后的png和csv图片信息文件写入到tscm文件
.EXAMPLE
    PS C:\> import-Tscm -path "c:\xxx.trec"
.NOTES
    这是一个对techsmith公司camtasia软件生成的trec格式录像文件中的光标文件进行替换的脚本
#>

}


<#
.SYNOPSIS
    导出png光标文件
.DESCRIPTION
    从tscm文件中导出png光标文件和光标xy轴,大小等信息的csv
.EXAMPLE
    PS C:\> import-Tscm -path "c:\xxx.trec"
.NOTES
    这是一个对techsmith公司camtasia软件生成的trec格式录像文件中的光标文件进行替换的脚本
#>

function export-png {
    #导出png光标文件
    [CmdletBinding()]
    param (
        # 路径
        [Parameter(Mandatory = $true, HelpMessage = "输入文件路径,例如: c:\xxx.tscm")]
        [string]
        $path        
    )
    
    if ($path -match '\.tscm') {
        $gd = [System.IO.File]::ReadAllBytes($path);
        $png = [System.BitConverter]::ToString($gd).replace('-','') | Select-String -Pattern '(?<length2>.{2})(?<length1>.{2})0{4}(?<x1>.{2})(?<x>.{2})0{4}(?<y1>.{2})(?<y>.{2})0{4}(?<image>89504e470d0a1a0a.{20,}?49454e44ae4260)' -AllMatches


        $new = split-path $path
        $x = 0
        $object = $png.Matches | % {
            $x++
            $l = '0x' + ($_.groups | ? { $_.name -like 'length1' }).Value + ($_.groups | ? { $_.name -like 'length2' }).Value 
            $y = '0x' + ($_.groups | ? { $_.name -like 'y' }).Value + ($_.groups | ? { $_.name -like 'y1' }).Value
            $xx = '0x' + ($_.groups | ? { $_.name -like 'x' }).Value + ($_.groups | ? { $_.name -like 'x1' }).Value
            $image = ($_.groups | ? { $_.name -like 'image' }).Value 
            [system.io.file]::WriteAllBytes("$new\$x.png", $([byte[]] -split ($image -replace '..', '0x$& ') ))
            [PSCustomObject]@{
                'Number'    = $x
                Length      = [convert]::ToString( $l, 10)
                X           = [convert]::ToString($xx , 10)
                Y           = [convert]::ToString($y , 10)
                ImageLength = $image.length / 2
                Image       = $image
            }
        } 
        $object | ft
        #$object | ConvertTo-json | set-content -path "$new\config.json"
        $object | ConvertTo-csv  | set-content -path "$new\config.csv"
    }
    else { "路径错误" }
}



<#
.SYNOPSIS
    通过原trec,tscm和png文件生成新的trec
.DESCRIPTION
    Long description
.EXAMPLE
    PS C:\> new-trec -trec 'xxxx.trec' -tscm 'xxxx.tscm'
    new-trec -trec [trec文件路径] -tscm [tscm文件路径]
.INPUTS
    Inputs (if any)
.OUTPUTS
    Output (if any)
.NOTES
    这是一个对techsmith公司camtasia软件生成的trec格式录像文件中的光标文件进行替换的脚本
#>


function new-trec {
    param (
        # 把新的trec,tscm和png生成新的trec
        [Parameter(mandatory = $true, HelpMessage = "请输入trec路径,例如:C:\Users\trecRec\config.trec")]
        [string]
        $trec,
        [Parameter(mandatory = $true, HelpMessage = "请输入trec路径,例如:C:\Users\trecRec\config.tscm")]
        [string]
        $tscm
    )
    try {
        $list = $trec, $tscm
        $br = test-path $list
        if ($br) {
            import-Tscm -path "$tscm"
            import-trec -path "$trec"
            write-host '完成'
        }
        else {
            for ($i = 0; $i -lt $list.Count; $i++) {
                if (!$br[$i]) { $jg = $list[$i] }
            }
            Write-Error "$jg 错误"
        }
    }
    catch {
        $_
    }
}