@ -3,14 +3,14 @@
# Ref: https://trac.ffmpeg.org/wiki/Encode/H.265
# https://github.com/rigaya/NVEnc/releases
$videoPath = 'M:\ 1_movies\kids.movies\Alvin und die Chipmunks (1-3) \'
$videoPath = 'M:\ 2_serien\_main.series\Luther \'
# HEVC : main, main10, main444
$profile = 'main10'
$NVEncoder = " $PSScriptRoot \encoder\NVEncC64.exe "
$ arguments = ''
$ fileTester = " $PSScriptRoot \mediainfo.exe "
if ( ! ( Test-Path $NVEncoder -PathType leaf ) )
{
@ -18,65 +18,129 @@ if(!(Test-Path $NVEncoder -PathType leaf))
exit
}
# Gets Video List File Contents
# Get video list from provided path:
$videos = Get-ChildItem -Path $videoPath -Name -Recurse -Include ( '*.avi' , '*.mp4' , '*.mkv' )
$videoID = 1
$videoID = 0
$notConvertedVideos = 0
$failedVideos = 0
$count = $videos . Count
if ( $videos . Count -lt 1 )
{
Write-Host " No videos found in: $ PSScriptRoot\video_file_list.txt " -ForegroundColor Red
Write-Host " No videos found in: $ videoPath " -ForegroundColor Red
exit
}
Write-Host " Converting $count videos .." -ForegroundColor Cyan
Write-Host " Found $count videos. - starting converter .." -ForegroundColor Cyan
foreach ( $video in $videos )
{
# Converts video using NVEncC64
$video = $video . Replace ( " `" " , " " )
$inputFile = $videoPath + $video
$outputFile = $videoPath + $video . Insert ( ( $video . Length - 4 ) , '(HEVC)' )
Write-Host
Write-Host " Converting video ( $videoID of $count ), please wait.. " -ForegroundColor Magenta
Write-Host " $video `n to: `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
# 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 `n to: `n $outputFile " -ForegroundColor White
Write-Host
$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'
$arguments = " --input `" $inputFile `" --codec hevc --audio-copy 1,2 --profile $profile --output `" $outputFile `" "
Start-Process $NVEncoder -ArgumentList $arguments #-WindowStyle Minimized
# Waits for process to complete
$processID = ( Get-Process $processName ) . id
Wait-Process -Id $processID
if ( Test-Path $outputFile )
$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 `n new 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
{
Write-Host " CONVERSION WORKED! FILE: `" $outputFile `" FOUND " -ForegroundColor Yellow
# TODO delete old and Move file name!
# Increments not converted video counter:
$notConvertedVideos = $notConvertedVideos + 1
Start-Sleep -Seconds 4
}
# Increments video counter
$videoID = $videoID + 1
Start-Sleep -Seconds 4
}
Write-Host " Finished converted $count videos. " -ForegroundColor Green
# 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
}
}
exit
Read-Host -Prompt " Press Enter to exit"