3

Мне нужен простой способ конвертировать видео в h264 с сохранением первоначальной даты создания.

Сейчас я делаю это вручную (кодирую, затем редактирую дату), но это супер скучная задача, когда у меня есть 10+ видео.

Есть ли способ сделать это автоматически?

Программа конвертации с опцией "сохранить исходную дату файла", пакет, скрипт: я открыт для любого решения в любой ОС.

5 ответов5

3

ТЕСТИРОВАНИЕ Скопируйте видео каталог в новый каталог, а затем следуйте инструкциям ниже.

Скрипт PowerShell

PowerShell поставляется с Windows 7, загрузка не требуется. (Пуск-> Все программы-> Стандартные-> Windows PowerShell).

Запустите PowerShell от имени администратора.

Вы должны выполнить следующее в первый раз, прежде чем сможете запустить какой-либо сценарий (вы должны сделать это только один раз)

Set-ExecutionPolicy RemoteSigned

Ответьте "Y".

Поместите следующие 2 скрипта в ваш видео каталог. Откройте PowerShell и перейдите в каталог с видео. .ps1 - расширение скрипта PowerShell.

SaveTime.ps1 (до конвертации видео)

Сохраните следующий скрипт как SaveTime.ps1 в вашем видео-каталоге. Запустите этот сценарий в PowerShell перед преобразованием видео.

Скрипт создаст OldTime-record.ps1 в том же каталоге.

Скрипт НЕ будет перезаписывать OldTime-record.ps1. Он будет добавлен в конец, только если файл уже существует.

Так что не беспокойтесь, если вы запустите его случайно и потеряете свою первоначальную метку времени. Просто используйте блокнот, чтобы удалить лишние строки. Я добавил пример этой ситуации в конце.

# SaveTime.ps1 - Start 
$file = get-item *

write-output "`$file = New-Object string`[`] $($file.count)" >> OldTime-record.ps1
write-output "`$time = New-Object string`[`] $($file.count)" >> OldTime-record.ps1

$time = New-Object string[] $file.count

for ($i = 0; $i -lt $file.count; $i++) {
    write-output "`$file`[$i`]=`'$($file[$i].fullname)`'" >> OldTime-record.ps1
    write-output "`$time`[$i`]=`'$($file[$i].CreationTimeUTC.tostring('o'))`'" >> OldTime-record.ps1
}
# SaveTime.ps1 - End

OldTime.ps1 (после конвертации видео)

Сохраните следующий скрипт как OldTime.ps1 в вашем видео-каталоге. Запустите этот скрипт в PowerShell после конвертации видео. Этот скрипт будет читать OldTime-record.ps1 и соответственно изменять время создания файла.

# OldTime.ps1 - Start
. .\OldTime-record.ps1

for($i = 0; $i -lt $file.count; $i++) {
    write-output "$($file[$i])"
    write-output "$($time[$i])"
    Set-ItemProperty -Path $($file[$i]) -Name CreationTimeUTC -Value $($time[$i])
}
# OldTime.ps1 - End

Oldtime-record.ps1

Этот файл содержит имя файла и время создания записи. Ниже показано, как это выглядит, если открыть его в блокноте.

$file = New-Object string[] 9
$time = New-Object string[] 9
$file[0]='E:\Downloads\test\New Folder'
$time[0]='2012-11-13T03:11:11.4504830Z'
$file[1]='E:\Downloads\test\file1'
$time[1]='2012-11-10T01:12:14.6126918Z'
$file[2]='E:\Downloads\test\file2'
$time[2]='2012-11-10T01:12:14.6646918Z'
$file[3]='E:\Downloads\test\file3'
$time[3]='2012-11-10T01:12:14.7276918Z'
$file[4]='E:\Downloads\test\cover.jpg'
$time[4]='2012-11-10T01:12:14.7886918Z'
$file[5]='E:\Downloads\test\OldTime.ps1'
$time[5]='2012-11-13T05:22:18.2124830Z'
$file[6]='E:\Downloads\test\SaveTime.ps1'
$time[6]='2012-11-13T05:44:22.8514830Z'
$file[7]='E:\Downloads\test\test.ps1'
$time[7]='2012-11-13T03:26:28.7084830Z'
$file[8]='E:\Downloads\test\test.time.ps1'
$time[8]='2012-11-13T05:32:51.8204830Z'

Вот что произойдет, если вы запустите SaveTime.ps1 случайно. Это просто добавить новые записи в конце. Чтобы исправить это, просто удалите все строки, начиная со второго вхождения $ file = New-Object string [].

$file = New-Object string[] 9
$time = New-Object string[] 9
$file[0]='E:\Downloads\test\New Folder'
$time[0]='2012-11-13T03:11:11.4504830Z'
$file[1]='E:\Downloads\test\file1'
$time[1]='2012-11-10T01:12:14.6126918Z'
$file[2]='E:\Downloads\test\file2'
$time[2]='2012-11-10T01:12:14.6646918Z'
$file[3]='E:\Downloads\test\file3'
$time[3]='2012-11-10T01:12:14.7276918Z'
$file[4]='E:\Downloads\test\cover.jpg'
$time[4]='2012-11-10T01:12:14.7886918Z'
$file[5]='E:\Downloads\test\OldTime.ps1'
$time[5]='2012-11-13T05:22:18.2124830Z'
$file[6]='E:\Downloads\test\SaveTime.ps1'
$time[6]='2012-11-13T05:44:22.8514830Z'
$file[7]='E:\Downloads\test\test.ps1'
$time[7]='2012-11-13T03:26:28.7084830Z'
$file[8]='E:\Downloads\test\test.time.ps1'
$time[8]='2012-11-13T05:32:51.8204830Z'
$file = New-Object string[] 11
$time = New-Object string[] 11
$file[0]='E:\Downloads\test\New Folder'
$time[0]='2012-11-13T03:11:11.4504830Z'
$file[1]='E:\Downloads\test\file1'
$time[1]='2012-11-10T01:12:14.6126918Z'
$file[2]='E:\Downloads\test\file2'
$time[2]='2012-11-10T01:12:14.6646918Z'
$file[3]='E:\Downloads\test\file3'
$time[3]='2012-11-10T01:12:14.7276918Z'
$file[4]='E:\Downloads\test\cover.jpg'
$time[4]='2012-11-10T01:12:14.7886918Z'
$file[5]='E:\Downloads\test\new  3.txt'
$time[5]='2012-11-13T06:47:05.4784830Z'
$file[6]='E:\Downloads\test\OldTime-record.ps1'
$time[6]='2012-11-13T05:50:11.7044830Z'
$file[7]='E:\Downloads\test\OldTime.ps1'
$time[7]='2012-11-13T05:22:18.2124830Z'
$file[8]='E:\Downloads\test\SaveTime.ps1'
$time[8]='2012-11-13T05:44:22.8514830Z'
$file[9]='E:\Downloads\test\test.ps1'
$time[9]='2012-11-13T03:26:28.7084830Z'
$file[10]='E:\Downloads\test\test.time.ps1'
$time[10]='2012-11-13T05:32:51.8204830Z'
2

Еще одно решение для Windows я нашел для тех, кто не хочет иметь дело с кучей скриптов:

Конвертировать и сохранить дату

После загрузки программа находится в файле MultipleAviConvDatePreserve\bin\Release\MultipleAviConvDatePreserve.exe.

И вы можете использовать его с любым конвертером, поддерживающим командную строку (например, ручным тормозом). Не самая простая в использовании программа, но проще, чем опубликованное решение.

Поскольку у меня были некоторые проблемы с тем, чтобы заставить программу работать самостоятельно, я подумал, что некоторые конкретные указания по использованию программы могут быть полезны.

Откройте Handbrake (или какой-нибудь видеокодер с поддержкой командной строки) и настройте файл для кодирования, как обычно (со всеми желаемыми предпочтениями), а затем добавьте его в очередь. Затем откройте очередь и нажмите кнопку "Очередь" и "Создать пакетный скрипт", как показано на снимке экрана ниже:
Создать пакетный скрипт Затем откройте пакетный скрипт в блокноте и скопируйте его содержимое (мы будем использовать его позже). Затем откройте MultipleAviConvDatePreserve.exe и нажмите кнопку "Установить сценарий" Установить СЦЕНАРИЙ
Затем вставьте содержимое пакетного сценария, сгенерированного Handbrake, в текстовое поле сценария, но замените источник и назначение в сценарии на% source и% dest:Введите сценарий
Я не смог заставить RunAsDate.exe работать, но вы можете попробовать его - он предположительно делает так, чтобы системную дату не нужно было менять. После этого нажмите ОК и вернитесь в главное окно. Затем нажмите "Выбрать DIR" и выберите каталог с видеофайлами, которые вы хотите конвертировать, сохранив исходную дату создания. Затем введите расширение EXACT (с учетом регистра) для источника под переключателем "Source extension", после чего вы увидите, что некоторые файлы появятся в списке (если вы не видите никаких файлов, значит, расширение неверно). Затем выберите файлы, которые вы хотите преобразовать (выделите их все, щелкнув по первому, а затем по последнему файлу, нажав Shift). Затем нажмите «GO!"и все должно быть самоочевидным оттуда.

1

На Windows с включенным Powershell вы можете использовать это.BAT скрипт для рекурсивного конвертирования всего.AVI и др.Файлы MP4 в текущем дереве папок. Предполагая, что вы кодируете с помощью ffmpeg из FF Prompt с теми же параметрами; в любом случае, не стесняйтесь редактировать команду кодирования в следующей строке. Обратите внимание на использование переменных% 1 и% 2 для хранения имен каждого исходного файла (например, «name.ext») и преобразованных (например, «name_.ext») файлов.

FOR /r %%I in (*.avi, *.mp4) DO CALL :loopbody "%%~fI" "%%~dpnI_%%~xI" "%%~tI"
GOTO :EOF

:loopbody
   ffmpeg -i %1 -c:v libx264 -crf 18 -maxrate 4000k -bufsize 4000k -c:a libvo_aacenc -q:a 100 -map_metadata 0 -preset veryslow -tune film -movflags +faststart %2
   powershell Set-ItemProperty -LiteralPath '%2' -Name CreationTimeUtc -Value ('%3' -as [Datetime])
0

Вы сказали «дата создания».  Если «дата модификации» достаточно хороша, читайте дальше:

Вы не сказали, какую ОС вы используете.  Если это * nix, используйте команду touch :

touch –r old_file new_file ...

устанавливает new_file «ы дату модификации / время , чтобы быть таким же , как old_file ы.

Это доступно в некоторых пакетах эмуляции Unix, таких как Подсистема для приложений на основе UNIX (SUA).  ISTR это бесплатная загрузка от Microsoft.

0

Какая ОС? Существуют сенсорные утилиты (как для командной строки, так и на основе графического интерфейса), которые позволят вам изменить дату создания, изменения и доступ к файлам.

Например, вот один для Windows (BulkFileChanger):

NirSoft BFC

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .