# Converts videos to HEVC for given path: # Ref: https://trac.ffmpeg.org/wiki/Encode/H.265 # https://github.com/rigaya/NVEnc/releases $videoPath = 'M:\2_serien\_main.series\Luther\' # HEVC : main, main10, main444 $profile = 'main10' $NVEncoder = "$PSScriptRoot\encoder\NVEncC64.exe" $fileTester = "$PSScriptRoot\mediainfo.exe" if(!(Test-Path $NVEncoder -PathType leaf)) { Write-Host "NVEncC64.exe not found, please check path in `"$NVEncoder`"." -ForegroundColor Yellow exit } # Get video list from provided path: $videos = Get-ChildItem -Path $videoPath -Name -Recurse -Include ('*.avi', '*.mp4', '*.mkv') $videoID = 0 $notConvertedVideos = 0 $failedVideos = 0 $count = $videos.Count if($videos.Count -lt 1) { Write-Host "No videos found in: $videoPath" -ForegroundColor Red exit } Write-Host "Found $count videos. - starting converter.." -ForegroundColor Cyan foreach($video in $videos) { $video = $video.Replace("`"", "") $inputFile = $videoPath + $video # Get and check File info for codec, if it is already HEVC: - JSON link: (['media']['track'][1]['Format']) $fileDetails = cmd /c $fileTester $inputFile --Output=JSON | ConvertFrom-Json $codec = $fileDetails.media.track[1].Format #echo $codec # If not already HEVC, convert video using NVEncC64: if($codec -ne "HEVC") { # Configure new file naming: if ($video -match "x264") { $outputFile = $videoPath + $video.Replace("x264", "x265") } else { $outputFile = $videoPath + $video.Insert(($video.Length - 4), '-HEVC') } Write-Host Write-Host "Converting video ($videoID of $count), please wait.." -ForegroundColor Magenta Write-Host "$video `nto:`n$outputFile" -ForegroundColor White Write-Host $arguments = "--input `"$inputFile`" --codec hevc --audio-copy 1,2 --profile $profile --output `"$outputFile`"" Start-Process $NVEncoder -ArgumentList $arguments #-WindowStyle Minimized $processName = 'NVEncC64' Start-Sleep -Seconds 8 # Sets to use 3 cores (always set to one less core that your CPU has) # 2 Cores = 3, 3 Cores = 7, 4 cores = 15, 5 cores = 31, 6 cores = 63 # Code to calculate for your CPU: # $noOfCores = Get-WmiObject Win32_Processor | Measure-Object NumberOfLogicalProcessors -Sum # $noOfCores.Sum = $noOfCores.Sum - 1 # [math]::Pow(2,$($noOfCores).Sum) - 1 # $process = Get-Process $processName; $process.ProcessorAffinity=7 Start-Sleep -Seconds 8 # Sets priorty to High # Values: High, AboveNormal, Normal, BelowNormal, Low $process = Get-Process -Id $process.Id $process.PriorityClass = 'High' # Waits for process to complete $processID = (Get-Process $processName).id Wait-Process -Id $processID if(Test-Path $outputFile) { Write-Host "CONVERSION DONE! FILE: `"$outputFile`" FOUND" -ForegroundColor Yellow Start-Sleep -Seconds 4 # Check if File is valid, with Duration of Video - it must be same! (['media']['track'][0]['Duration']): $fileDetails_new = cmd /c $fileTester $outputFile --Output=JSON | ConvertFrom-Json $StreamSize_old = $fileDetails.media.track[0].Duration $StreamSize_new = $fileDetails_new.media.track[0].Duration Write-Host Write-Host "Old Duration was: $StreamSize_old `nnew Duration is: $StreamSize_new" -ForegroundColor White Write-Host if ($StreamSize_new -eq $StreamSize_old) { # Delete old video File! Write-Host "Conversion Succesful! - Deleting old file.." Remove-Item -Path $inputFile } else { # Delete corrupt File! Write-Host "Conversion Failded! - Deleting new converted file.." Remove-Item -Path $outputFile $failedVideos = $failedVideos + 1 $notConvertedVideos = $notConvertedVideos + 1 $videoID = $videoID - 1 } } # Increments video counter: $videoID = $videoID + 1 Start-Sleep -Seconds 4 } else { # Increments not converted video counter: $notConvertedVideos = $notConvertedVideos + 1 Start-Sleep -Seconds 4 } } # If confersion is done: if($notConvertedVideos -eq 0) { Write-Host "Finished converted $videoID out of $count videos." -ForegroundColor Green } else { if($failedVideos -eq 0) { Write-Host "Finished converted $videoID out of $count videos. - $notConvertedVideos where not converted because of already correct codec!" -ForegroundColor Green } else { Write-Host "Finished converted $videoID out of $count videos. - $notConvertedVideos where not converted because error or already correct codec!!" -ForegroundColor Green Write-Host "$failedVideos have failed!" -ForegroundColor Red } } Read-Host -Prompt "Press Enter to exit"