Старший Пользователь
Регистрация: 25.11.2007
Возраст: 52
Город: СПб, Гондурас
Регион: 78, 98
Машина: Toyota Prius 11S выпуска 2001/09
Сообщений: 766
|
Иногда возникает желание сделать копию текущей CF-карты в файл так, чтобы можно было, во-первых, просмотреть на ПК в CFCardViewer'е иль DVRPlayer'е, а, во-вторых, иметь возможность развернуть этот файл обратно на CF-карту, чтобы снова проиграть отснятое на устройстве.
Использовать на carpc для этих целей CFCardViewer'е иль DVRPlayer'е жутко неудобно, поскольку они оба работают на разрешении экрана от 1024x768. К тому же обе эти проги не позволяют записывать на флешку видео из файла.
Что сделал:
Сначала попробовал копировать/восстанавливать флешку руками при помощи dd. Получилось.
Команда для копирования флешки в файл:
dd if=\\.\G: of=D:\Dvr\test.law bs=36143616c skip=1
G: - буква диска CF-карты в картридере
36143616 - столько байт не используется вначале карты (их надо пропустить, чтобы этот файл потом можно было просмотреть на ПК)
Команда для записи на флешку из файла:
dd of=\\.\G: if=D:\Dvr\test.law bs=36143616c seek=1
Т.к. я достаточно ленив, то и набирать эти команды руками тож неинтересно.
Написал два ahk-скрипта:
DVRCF2File.ahk - копирование видео с флэшки в файл:
Код:
#Persistent
#SingleInstance ignore
DefaultDVRFolder := "D:\videograb" ; каталог для сохранения записанного видео
DefaultFlashLabel := "DVRFLASHCF" ; Label флешек с видео (для их автоматического определения)
DriveGet, list, list, REMOVABLE
; отпарсить list
found := ""
foundcap := 0
DDFolder := ""
DDReady := 0
Gosub, progressOn
Loop, Parse, list
{
folder := A_LoopField ":\"
DriveGet, cap, capacity, %folder%
DriveGet, fs, fs, %folder%
DriveGet, label, label, %folder%
DriveGet, status, status, %folder%
If(status = "Ready" && fs = "FAT32" && label = DefaultFlashLabel) {
found := folder
foundcap := cap
}
}
if(foundcap = 0) {
Gosub, progressOff
FileSelectFolder, MyVar2, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}, 0, Выберите накопитель с CF-картой
Gosub, progressOn
SplitPath, MyVar2, , , , , MyVar2
DriveGet, fs, fs, %MyVar2%
DriveGet, type, type, %MyVar2%
DriveGet, status, status, %MyVar2%
DriveGet, cap, capacity, %MyVar2%
If(type != "Removable") {
Progress, , Выбранный носитель не является сменным`nОперация отменена`n
Sleep, 3000
} Else If (status != "Ready") {
Progress, , Выбранный носитель не готов`nОперация отменена`n
Sleep, 3000
} Else If (fs != "FAT32") {
Progress, , На выбранном носителе не обнаружен FAT32`nОперация отменена`n
Sleep, 3000
} Else {
found := MyVar2
foundcap := cap
}
}
DDFolder := DefaultDVRFolder
DriveSpaceFree, fsize, %DDFolder%
if(foundcap > fsize+1) {
Gosub, progressOff
FileSelectFolder, MyVar, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}, 0, Выберите каталог для сохранения
Gosub, progressOn
DriveSpaceFree, fsize, %MyVar%
If (foundcap > fsize+1) {
Progress, , В указанном каталоге недостаточно места`nОперация отменена`n
Sleep, 3000
} Else {
DDReady := 1
DDFolder := MyVar
}
} Else {
DDReady := 1
}
if(DDReady = 1 && foundcap > 0) {
allcount := foundcap
count := round((allcount * 1024 * 1024 - 36143616)/36143616)
allcount := round((count * 36143616 / 1024) / 1024)
copyspeedtext := a_space
percent := 0
prevsize := 0
Progress, A M1 R0-%allcount% Y410 ZH40 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, %percent%`%`r`n%copyspeedtext%, Копирование DVR-CF, DVR-CF, Tahoma
WinActivate, DVR-CF
FormatTime, tmpfilename,, yyyyMMdd_HHmm
destfilename := DDFolder "\DVR_" tmpfilename ".law"
StringLeft, found, found, 2
copytime := A_TickCount
SetTimer, progressOnreal, 1000
Run, dd if=\\.\%found% of=%destfilename% bs=36143616c skip=1,, Hide, DDpid
} Else {
Progress, Off
ExitApp
}
return
progressOn:
Progress, M1 R0-%allcount% Y410 ZH0 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, %a_space%`r`n%a_space%`r`n%a_space%, Копирование DVR-CF, DVR-CF, Tahoma
return
progressOff:
Progress, A M1 R0-%allcount% Y410 ZH0 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, %a_space%`r`n%a_space%`r`n%a_space%, Копирование DVR-CF, DVR-CF, Tahoma
return
progressOnreal:
FileGetSize, cur, %destfilename%, M
percent := round((cur / allcount)*100)
if(percent > 100)
{
percent := 100
}
if(prevsize != cur)
{
prevsize := cur
curcopytime := (A_TickCount - copytime) / 1000
copyspeed := round((allcount - cur) / (cur / curcopytime))
If(cur > 5)
{
if(copyspeed < 1)
{
copyspeedtext := "завершено"
} Else {
copyspeedtext := "осталось " copyspeed " сек"
}
}
}
Progress, %cur%, %percent%`%`r`n%copyspeedtext%
Process, Exist, %DDpid%
If(%ErrorLevel% = 0)
{
Sleep, 1000
Progress, Off
ExitApp
}
return
File2DVRCF.ahk - запись видео из файла на флэшку:
Код:
#Persistent
#SingleInstance ignore
DefaultDVRFolder := "D:\videograb" ; каталог для сохранения записанного видео
DefaultFlashLabel := "DVRFLASHCF" ; Label флешек с видео (для их автоматического определения)
DriveGet, list, list, REMOVABLE
; отпарсить list
found := ""
foundcap := 0
DDFolder := ""
DDReady := 0
Gosub, progressOn
Loop, Parse, list
{
folder := A_LoopField ":\"
DriveGet, cap, capacity, %folder%
DriveGet, fs, fs, %folder%
DriveGet, label, label, %folder%
DriveGet, status, status, %folder%
If(status = "Ready" && fs = "FAT32" && label = DefaultFlashLabel) {
found := folder
foundcap := cap
}
}
if(foundcap = 0) {
Gosub, progressOff
FileSelectFolder, MyVar2, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}, 0, Выберите накопитель с CF-картой
Gosub, progressOn
SplitPath, MyVar2, , , , , MyVar2
DriveGet, fs, fs, %MyVar2%
DriveGet, type, type, %MyVar2%
DriveGet, status, status, %MyVar2%
DriveGet, cap, capacity, %MyVar2%
If(type != "Removable") {
Progress, , Выбранный носитель не является сменным`nОперация отменена`n
Sleep, 3000
} Else If (status != "Ready") {
Progress, , Выбранный носитель не готов`nОперация отменена`n
Sleep, 3000
} Else If (fs != "FAT32") {
Progress, , На выбранном носителе не обнаружен FAT32`nОперация отменена`n
Sleep, 3000
} Else {
found := MyVar2
foundcap := cap
}
}
DDFolder := DefaultDVRFolder
Gosub, progressOff
FileSelectFile, MyVar, 33, %DefaultDVRFolder%, Выберите файл для записи на CF-карту, dvr-raw (*.raw;*.law)
Gosub, progressOn
FileGetSize, fsize, %MyVar%, M
If (foundcap > fsize+45 || foundcap < fsize+30) {
Progress, , Размер файла не соответствует CF-карте`nОперация отменена`n
Sleep, 3000
} Else {
DDReady := 1
DDFile := MyVar
}
if(DDReady = 1 && foundcap > 0) {
StringLeft, found, found, 2
Progress, A M1 R0-%allcount% Y410 ZH0 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, Идёт запись`r`nВремя неизвестно`r`nЖдите, Запись DVR-CF, DVR-CF, Tahoma
WinActivate, DVR-CF
copytime := A_TickCount
SetTimer, progressOnreal, 1000
Run, dd of=\\.\%found% if=%DDFile% bs=36143616c seek=1,, Hide, DDpid
} Else {
Progress, Off
ExitApp
}
return
progressOn:
Progress, M1 R0-%allcount% Y410 ZH0 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, %a_space%`r`n%a_space%`r`n%a_space%, Запись DVR-CF, DVR-CF, Tahoma
return
progressOff:
Progress, A M1 R0-%allcount% Y410 ZH0 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, %a_space%`r`n%a_space%`r`n%a_space%, Запись DVR-CF, DVR-CF, Tahoma
return
progressOnreal:
curcopytime := round((A_TickCount - copytime) / 1000)
min := floor(curcopytime/60)
sec := curcopytime - min*60
if(sec < 10)
{
sec := "0" sec
}
Progress, , Идёт запись`r`n%min%:%sec%`r`nЖдите
Process, Exist, %DDpid%
If(%ErrorLevel% = 0)
{
Sleep, 1000
Progress, Off
ExitApp
}
return
Если флешка имеет метку (label) DVRFLASHCF, то первый скрипт работает на полном автопилоте, а второй запрашивает название файла для записи. Если метки нет, то придётся еще указать букву диска, с которого читать иль на который писать.
|