web-dev-qa-db-ja.com

(バッチ)元のタイムスタンプ/作成日を維持しながらビデオを変換する

元の作成日を維持しながら、ビデオをh264に変換する簡単な方法が必要です。

現在、手動で行っています(エンコードしてから日付を編集します)が、10本以上のビデオがある場合は非常に退屈な作業です。

それを自動的に行う方法はありますか?

「元のファイルの日付を保持する」オプション、バッチ、スクリプトを備えた変換プログラム:どのOSでもどのソリューションでも利用できます。

4
Magnetic_dud

[〜#〜] tests [〜#〜]ビデオディレクトリを新しいディレクトリにコピーしてから、以下の手順に従ってください。

PowerShellスクリプト

PowerShellにはWindows7が付属しており、ダウンロードは必要ありません。 ([スタート]-> [すべてのプログラム]-> [アクセサリ]-> [Windows PowerShell])。

管理者としてPowerShellを起動します。

スクリプトを実行する前に、初めてフォローする必要があります(一度だけ実行する必要があります)

Set-ExecutionPolicy RemoteSigned

「Y」と答えます。

次の2つのスクリプトをビデオディレクトリに配置します。 PowerShellを開き、ビデオディレクトリにCDを挿入します。 。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を実行すると、次のようになります。最後に新しいレコードを追加するだけです。これを修正するには、2番目に出現する$ 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'
3
John Siu

大量のスクリプトを処理する必要がない人のために私が見つけたWindowsの別のソリューション:

変換と日付の保持

ダウンロードすると、プログラム自体はMultipleAviConvDatePreserve\bin\Release\MultipleAviConvDatePreserve.exeにあります。

また、コマンドラインを許可する任意のコンバーター(ハンドブレーキなど)で使用できます。使用するのが最も簡単なプログラムではありませんが、投稿されたソリューションよりも簡単です。

プログラムを自分で動作させるのに苦労したので、プログラムの使用方法に関する特定の指示が役立つかもしれないと思いました。

ハンドブレーキ (またはコマンドライン対応のビデオエンコーダー)を開き、通常どおりに(必要なすべての設定で)エンコードするファイルをセットアップして、キューに追加します。次に、キューを開き、以下のスクリーンショットに示すように、[キュー]ボタンと[バッチスクリプトの生成]をクリックします。
Generate Batch Script 次に、メモ帳でバッチスクリプトを開き、内容をコピーします(後で使用します)。次にMultipleAviConvDatePreserve.exeを開き、[スクリプトの設定]ボタンをクリックします Set SCRIPT
次に、Handbrakeによって生成されたバッチスクリプトの内容をスクリプトテキストボックスに貼り付けますが、スクリプトのソースと宛先を%sourceと%destに置き換えます。 Enter script
RunAsDate.exeを動作させることができませんでしたが、試してみることができます。おそらく動作するので、システム日付を変更する必要はありません。この後、[OK]をクリックして、メインウィンドウに戻ります。次に、[ディレクトリの選択]をクリックし、元の作成日を保持したまま、変換するビデオファイルのあるディレクトリを選択します。次に、ラジオボタン「ソース拡張子」の下にソースの正確な(大文字と小文字を区別する)ファイル拡張子を入力します。その後、リストにいくつかのファイルが表示されます(ファイルが表示されない場合は、拡張子が間違っています)。次に、変換するファイルを選択します(最初のファイルをクリックしてから、Shiftキーを押しながら最後のファイルをクリックしてすべてを選択します)。次に「GO!」を押します。そして、そこからすべてが自明でなければなりません。

2
Nathan

Powershellが有効になっているWindowsでは、この.BATスクリプトを使用して、現在のフォルダーツリー内のすべての.AVIファイルと.MP4ファイルを再帰的に変換できます。同じパラメータでFFプロンプトからffmpegを使用してエンコードしていると仮定します。とにかく、最後の行の次のエンコーディングコマンドを自由に編集してください。 %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])
1
smart.fr

私はついに簡単で十分な方法を見つけました! Windows XPでテストされており、おそらくそれ以上のシステムで動作します。

  1. お気に入りのバッチコンバーターでファイルを変換します。 Switch Audio File Converter Software を使用しました。これらすべてのツールにタイムスタンプの保持機能がない理由がわかりません!それはとても基本的です。そして、彼らは時々、オプションが必要ない理由を愚かに主張することさえあります( 1 および 2 を参照)
  2. Windows用のtouchユーティリティをダウンロードします。私の場合、RToolsとQGis内にありますが、たとえば、 Win32用のGNUユーティリティ
  3. ディレクトリでcmdコマンドを実行します。ここには、元のビデオファイル(私の場合は_*.MOV_)と生成された出力ファイル(私の場合は_*.wav_ファイル)があります。次のコマンドを入力します(拡張子を適切に変更します)。

    for %f in (*.wav) do (touch %f -r %~nf.MOV)

    出力は次のとおりです。

enter image description here

ヒューレカ!すべての出力ファイルのタイムスタンプは、元のファイルに対応しています。

0
Tomas

あなたは「作成日」と言いました。 「変更日」で十分な場合は、以下をお読みください。

使用しているOSについては言わなかった。 * nixの場合は、touchコマンドを使用します。

 touch –r old_filenew_file ... 

new_fileの変更日時をold_fileと同じに設定します。

これは、UNIXベースアプリケーション用サブシステム(SUA)などの一部のUnixエミュレーションパッケージで利用できます。 ISTRこれはMicrosoftからの無料ダウンロードです。

0
Scott

どのOS?ファイルの作成、変更、およびアクセス日を変更できるタッチユーティリティ(コマンドラインとGUIベースの両方)があります。

たとえば、これはWindows用のものです( BulkFileChanger ):

NirSoft BFC

0
Karan