Тема: КАРКАМ SA-4
Показать сообщение отдельно
Старый 17.08.2009, 00:27   #28
ashu
Старший Пользователь
 
Аватар для ashu
 
Регистрация: 25.11.2007
Возраст: 52
Город: СПб, Гондурас
Регион: 78, 98
Машина: Toyota Prius 11S выпуска 2001/09
Сообщений: 766
ashu has a spectacular aura aboutashu has a spectacular aura about
По умолчанию

Иногда возникает желание сделать копию текущей 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, то первый скрипт работает на полном автопилоте, а второй запрашивает название файла для записи. Если метки нет, то придётся еще указать букву диска, с которого читать иль на который писать.
__________________
Мой Toyota Prius NHW11
ashu вне форума   Ответить с цитированием