
CCTV 映像を管理しようとしており、ffmpeg を使用してバッチ圧縮しようとしています。
今のところ、私はこのコマンドを思いついた
ffmpeg -i "0515 210004.mp4" -b 200000 output.avi
でも全部一度にやらなきゃいけないんだしかし現在の日付を除外する
今日が16.05なら、私のフォルダには
"0515 210004.mp4"
"0515 220004.mp4"
"0515 230004.mp4"
"0516 000004.mp4"
"0516 010004.mp4"
等々
変換する必要があるのは 0515 を含むファイルだけです。毎日その番号が増えるはずなので、17.05 では 0516 を含むすべてのファイルを変換する必要があります。
また、ファイルによっては_1「0515 180004_1.mp4」のように
(末尾の004はいつもそこには)
また、まったく同じ名前で出力する必要もあります。
こんな感じです
for %%A IN (*.mp4) DO ffmpeg -i "contains "%date% - 1day"" -b 200000 "oldfilename.avi"
これはうまくいかないことは分かっていますが、これを擬似コードと呼ぶことにします
どうすれば私のタスクを達成できるか、何かアイデアはありますか?
ああ、私はWindows 7 x64を使用しています
また、ffmpegの部分について何か提案があれば、喜んでコードを調整します。
答え1
あなたの質問に感謝します。「私の任務を達成する方法について何かアイデアはありますか?」そして、あなたはコードの書き方を尋ねたわけではありません。学びたいのだと思います。だからこの答えです。
- どちらが鍵、ユニークで、操作する項目だけを選択できるもの。この場合、名前の最初の4文字現在のディレクトリ内のファイルの。良いですね
。1 月 1 日や 12 月 31 日の場合は長さが同じなので、さらに良いです (使用を強制されない場合でも)。
これで、バッチ スクリプトを段階的に記述できます。
-
$date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd')
フォーマットと変数名については上記の部分を変更する必要があることに注意してください。明日も必要になります。
yesterday という文字列に一致するすべてのファイルを選択します。(For および Yesterday 変数)
- それぞれ[2]昨日の部分文字列を明日の部分文字列に置き換えて、新しい名前の変数に格納します(スクリプトに実行させます)。[1] . ...
.mp4
でも変更することを忘れないでください。.avi
- 構築した文字列を出力します。
- プログラムに確信が持てたら、出力行を ffmpeg のものに変更します。
これで、各ステップを検索し、関連するコマンドを調整するだけです...
PS> 2 回目には、出力ファイルの存在のチェック (存在する場合は上書きしません)、処理されたファイルの数、スクリプトの終了が正常か不良かなど、スクリプトを拡張できます。
答え2
結局こうなった
コードの最適化に関する提案があれば、喜んで取り入れさせていただきます。
MMdd で昨日の日付を取得 -> その日付で始まるすべてのファイルを選択 -> ffmpeg を使用して圧縮 -> 月に応じて別のフォルダーに移動 -> ソース ファイルを削除
$a = (get-date).AddDays(-1).ToString("MMMM")
$d = (get-date).AddDays(-1).ToString("MMdd")
$inProcessPath = "sourcepath"
$oldVideos = Get-ChildItem -Include @("$d *") -Path $inProcessPath -Recurse;
Set-Location -Path 'D:\ffmpeg\bin';
foreach ($oldVideo in $oldVideos) {
$newVideo = [io.path]::ChangeExtension($oldVideo.FullName, '.avi')
$ArgumentList = '-i "{0}" -b 200000 "{1}"' -f $oldVideo, $newVideo;
Start-Process -FilePath "D:\ffmpeg\bin\ffmpeg.exe" -ArgumentList $ArgumentList -Wait -NoNewWindow;
}
Robocopy D:\Main\AdWords\ffmpeg\bin\ntv "D:\path\$a" "$d *.avi" /mov
get-childitem "sourcepath" -include "$d *.mp4" -recurse | foreach ($_) {remove-item $_.fullname}