Что нового

Русская кодировка в Windows Media

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Написал я тут скрипт, который формирует bat файл для кодирования списка файлов, с помощью Windows Media. Смысл в том, что в командной сроке этот кодировщик отказывается понимать русские имена файлов, в результате пришлось кодировать все вместо исходной папки в некую папку временную с английскими названиями. Если для файла, который является источником вывернуться удалось, с помощью функции вызывающей кроткое имя файла, то вот с конченным файлом - ну никак! Есть какие-нибудь идеи,как это обойти?
Код:
;Формируем строку команд
#include <Array.au3>
#include <file.au3>
#include <GUIConstants.au3>

dim $files[1]
dim $A[1]
dim $i=0
dim $filesName[1]
Dim $szDrive, $szDir, $szFName, $szExt

global $bb = 'c:\Program Files\Windows Media Components\Encoder\zap.bat'
global $temp='c:\Video\temp\'
global $sp = 'c:\Program Files\Windows Media Components\Encoder\'

#Region ### START Koda GUI section ### Form=C:\proekt\Кодирование\form\Form1.kxf
$Form1 = GUICreate("Кодирование фафлов в архив", 422, 372, 217, 125)
$Button1 = GUICtrlCreateButton("Обзор", 296, 32, 105, 25, 0)
$Input1 = GUICtrlCreateInput("", 16, 32, 265, 21)
$Label1 = GUICtrlCreateLabel("Директория", 16, 8, 66, 17)
$Group1 = GUICtrlCreateGroup("Тип экрана", 16, 64, 385, 57)
$Radio1 = GUICtrlCreateRadio("Широкоэкранный", 32, 88, 105, 17)
GUICtrlSetState($Radio1, $GUI_CHECKED)
$Radio2 = GUICtrlCreateRadio("Квадратный", 264, 80, 121, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label2 = GUICtrlCreateLabel("Файлы для кодирования", 16, 125, 166, 122)
$List1 = GUICtrlCreateList("", 16, 140, 385, 201)
$knOK = GUICtrlCreateButton("ОК", 16, 345, 113, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Button1
			
			$var = _Vibordir()
			if $var <>"" Then 
			GUICtrlSetData ($Input1,$var)
			_FileListR($files, $i, $var)
			$var=_ArrayToString($files)
			GUICtrlSetData ($List1,$var)
			;GUIDelete()
			endif
			
		Case $knOK
			$var=GUICtrlRead($radio1)
			$pp = GUICtrlRead($Input1)
			if $var=1 Then 
				_kod($pp,2) 
			Else 
				_kod($pp,1)
			EndIf
	EndSwitch
WEnd

func _Vibordir()

$path = FileSelectFolder('Выбираем директорию',"")
If $path="" Then
msgbox(0,'Кодировщик файлов','Директория не выбрана')
Return  ""	
Else
Return  $path	
EndIf

EndFunc

func _Kod($path,$metod)

ReDim $filesName[UBound($files)]
;Формируем батник
if FileExists($bb) then FileDelete($bb)

$fi = FileOpen($bb, 2)
for $i=0 to UBound($files)-1
		;переименовываем
		$filesName[$i]=$i&'.avi'
		$ss =_Stroka($files[$i],$filesName[$i],$metod)			
		FileWriteLine($fi, $ss)
Next	
FileClose($fi)

MsgBox(0, "Начинаем кодирование", $var)
FileChangeDir($sp) 
$var= ShellExecuteWait($bb)
MsgBox(0, "Кодирование закончено", $var)
	
for $i=0 to UBound($files)-1
		$TP = _PathSplit($files[$i], $szDrive, $szDir, $szFName, $szExt)
		FileMove($temp&$filesName[$i], $szDrive&$szDir&$szFName&'.wmv')
Next	

EndFunc

Func _FileListR(ByRef $rArray, ByRef $cNumber, $ParentDir, $SearchDir = $ParentDir)
    FileChangeDir($SearchDir) ; Переходим в каталог для поиска
    Local $sHandle = FileFindFirstFile("*") ; Инициализируем поиск
    While 1
        If $sHandle = -1 Then ; Если каталог пуст изначально - закрываем хэндл и прекращаем поиск
            FileClose($sHandle)
            ExitLoop
        EndIf
        
		$rArray[$cNumber] = @WorkingDir & "\" & FileFindNextFile($sHandle) ; Иначе заносим в массив полный путь к найденному элементу
        
		If @error Then ; Если файлы/каталоги закончились - закрываеи хэндл и прекращаем поиск
            FileClose($sHandle)
            ExitLoop
        EndIf
        $cNumber += 1 ; Иначе переходм к следующему элементу массива
        If $cNumber >= UBound($rArray) Then ReDim $rArray[2*$cNumber] ; Если место в массиве закончилось - удваиваем его размер
        If StringInStr(FileGetAttrib($rArray[$cNumber-1]), "D") Then _FileListR($rArray, $cNumber, @WorkingDir, $A[$cNumber-1]) ; Если найденное - каталог, то продолжаем поиск в нём.
    WEnd
    FileChangeDir($ParentDir) ; Переходим в родительский каталог
    If $ParentDir = $SearchDir Then ReDim $rArray[$I] ; Если родительский каталог = каталог для поиска (поиск закончен) - уменьшаем размер массива до необходимого
		
EndFunc
	
	func _Stroka($fullname,$zamena,$format)
		
	Dim $szDrive, $szDir, $szFName, $szExt
	
	$TestPath = _PathSplit($fullname, $szDrive, $szDir, $szFName, $szExt)
	$name= FileGetShortName($fullname) 			
	
	$d = $szDrive&$szDir
	$s = 'cscript.exe wmcmd.vbs -input ' 
	$s =$s&$name
	$s =$s&' -output '
	;Формируем файл архива
	$s1 =$temp&$zamena&'.wmv'
	$s =$s&$s1
	$s =$s&' -loadprofile '
	$s =$s&'c:\Video\Formats\form_'&$format&'.wme '	
	return $s
	EndFunc
 
Верх