(Batch) converting a video while keeping the original time stamp/creation date
Solution 1
TESTING Copy your video directory to a new directory, then follow instruction below.
PowerShell Script
PowerShell come with Windows 7, no download needed. (Start->All Programs->Accessories->Windows PowerShell).
Start PowerShell as administrator.
You have to do following for the first time before you can run any script(you only have to do it once)
Set-ExecutionPolicy RemoteSigned
Answer "Y".
Put following 2 scripts in your video directory. Open PowerShell and cd to your video directory. .ps1 is PowerShell script extension.
SaveTime.ps1 (before video conversion)
Save following script as SaveTime.ps1 in your video directory. Run this script in PowerShell before your video conversion.
The script will create OldTime-record.ps1 in the same directory.
The script WILL NOT OVERWRITE OldTime-record.ps1. It will only append to the end if the file already exist.
So no worry if you run it by accident and losing your original time-stamp. Just use notepad to remove the extra lines. I added an example of this situation at the end.
# 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 (after video conversion)
Save following script as OldTime.ps1 in your video directory. Run this script in PowerShell after video conversion. This script will read OldTime-record.ps1 and change file creation time accordingly.
# 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
This file hold file name and creation time records. Following shows what it look like if you open it in notepad.
$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'
Following is what happen if you run SaveTime.ps1 by accident. It just append the new records at the end. To fix it, just delete all lines starting from the second occurrence of $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'
Solution 2
Another solution for Windows I just found for those who don't want to have to deal with a ton of scripting:
Once you download it, the program itself is located in MultipleAviConvDatePreserve\bin\Release\MultipleAviConvDatePreserve.exe
And you can use it with any converter that allows command-line (such as handbrake). Not the easiest program to use, but easier than the posted solution.
Because I had some trouble getting the program to work myself, I thought some specific directions on how to use the program might be helpful.
Open Handbrake (or some command-line enabled video encoder) and setup a file for encode like you normally would (with all the preferences you want) and then add it to the queue. Then open the queue and click the "Queue" button and "Generate Batch Script" as shown in the screen shot below:
Then open the batch script in notepad and copy the contents (we will use it later).
Next open up MultipleAviConvDatePreserve.exe
And click the "Set SCRIPT" button
Then paste the contents of the batch script generated by Handbrake into the script text box but replace the source and destination in the script to %source and %dest:
I couldn't get the RunAsDate.exe to work, but you can try it out - it supposedly makes it so the system date doesn't need to be changed.
After this, click OK and return to the main window. Then click the "Select DIR" and choose the directory with the video files you want to convert while preserving the original creation date.
Then enter the EXACT (case-sensitive) file extension for the source under radio button "source Extension" after which you should see some files appear in the list (if you don't see any files, then the extension is wrong). Then select the files you want to convert (select them all by clicking the first one and then shift-clicking the last file).
Then press "GO!" and everything should be self-explanatory from there.
Solution 3
On Windows with Powershell enabled, you can use this .BAT script to recursively convert all .AVI and .MP4 files in the current folder tree. Assuming you're encoding with ffmpeg from the FF Prompt with the same parameters; anyway feel free to edit the encoding command on the next to last line. Please note the use of %1 and %2 variables to hold the names of each original (e.g. "name.ext") and converted (e.g. "name_.ext") files.
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])
Related videos on Youtube
Magnetic_dud
I am an average computer-enthusiast :) Unfortunately, i am a lousy programmer :(
Updated on September 18, 2022Comments
-
Magnetic_dud almost 2 years
I need an easy way to convert videos to h264 while keeping the original creation date.
Right now I'm doing it manually (encode, then edit the date), but it's a super boring task to do when I have 10+ videos.
Is there a way to do it automatically?
A conversion program with a "keep original file date" option, a batch, a script: i'm open to any solution on any OS.
-
Magnetic_dud over 11 yearsSolutions for any os are OK, I have Windows 7, OS X 10.7.4 and Debian 6
-
Magnetic_dud over 11 yearsI found this reviews.handbrake.fr/r/55/diff/1 , unfortunately, after many tries, I can't make it compile correctly (I can compile revision 3818, but I can't compile the diff...)
-
-
UtahJarhead over 11 yearsTo add to that, to my knowledge there is no way to modify ctime, only mtime. Hope that helps.
-
Magnetic_dud over 11 yearsmodification date is not ok, because almost all video editing software will sort by creation date :(
-
Magnetic_dud over 11 yearsYes, i use this to change manually the date. The problem is that when I have to change 10+ files, it's boring...
-
Karan over 11 yearsLike I said above, plenty of other command-line touch utilities as well: Windows recursive touch commands. Plus of course if you want to set the same date/time for multiple files, the program above is not called BulkFileChanger for nothing. :)
-
John Siu over 11 yearsIn Linux, ctime is change time, which should always has the same value of mtime (modify time). Ext4 (filesystem) has crtime, which is creation time. However, using debugfs and stat on 2 different systems, I did not get expected result.
-
Scott - Слава Україні over 11 years@John: It sounds like your Linux system might be non-standard. On most *nix systems, chmod’ing a file, or creating (or deleting) a hard link to it, will update ctime but not mtime.
-
Magnetic_dud over 11 yearsAwesome! If I also want to change the modification date, I just add Set-ItemProperty -Path $($file[$i]) -Name LastWriteTime -Value $($time[$i]) in the FOR cycle, right?
-
John Siu over 11 yearsYes, just make sure you use the UTC version of the time function. That will keep you away from any time zone issue.
-
Magnetic_dud over 11 yearsWith LastWriteTimeUTC
-
John Siu over 11 yearsYes. That is correct :D
-
Magnetic_dud over 11 yearsIt doesn't work for me - I think it can only work in Windows XP because it changes the system date before the conversion (not so safe)
-
Nathan over 11 yearsI added instructions in case that helps :)
-
Scott - Слава Україні almost 5 yearsThis seems like a slightly polished version of my answer. Which would be fine, if you said you were building on my answer. But you said that my answer doesn’t work on Windows, and then you posted an answer saying to use
touch
-r
on Windows. P.S. Your command may work, but it’s traditional to put options before arguments. P.P.S. The OP said in a comment on my answer “modification date is not ok, because almost all video editing software will sort by creation date”, … (Cont’d) -
Scott - Слава Україні almost 5 years(Cont’d) … and yet your answer doesn’t address the issue of what timestamp is set. (If you’re going to show a screenshot of a cmd window, showing
dir
before and after would be more valuable than simply showing the machinery of thefor
loop.) P.P.P.S. See also Difference between UnxUtils and GnuWin32? and Alternatives to unxutils and similar software. -
Tomas almost 5 years@Scott I am not building on your answer. I was using
touch
in Linux for +25 years. At the time I wrote my comment on your answer, I didn't know it exists for Windows and I didn't know it can be scripted in this way. I had to elaborate all this solution myself to solve that problem on my PC myself. Your answer didn't help me on the way. Fair enough, deleting my comment. Regarding the type of the timestamp, doesn't look like OP was concerned about the particular timestamp type, seems he just used different terminology, so no issue there. Regards.