From 3a33e96bb7279df28ae866c3cfc1513d0e272646 Mon Sep 17 00:00:00 2001 From: Michael Reber Date: Mon, 23 Mar 2020 16:45:28 +0100 Subject: [PATCH] Update README.md and fix some stuff --- README.md | 28 ++++++++++++++-------------- convert_Videos.ps1 | 21 ++++++++++++--------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 66a8a9e..38ef35b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -# FFmpeg-HEVC-Video-Converter 1.0 +# Automated HEVC-Video-Converter 1.0 -A PowerShell script to convert videos to the HEVC video format utilizing GPU hardware acceleration using FFmpeg for Windows. +A PowerShell script to convert videos to the HEVC video format utilizing GPU hardware acceleration using NVEnc for Windows. The main benefit being that you can save disk space significantly (most of the time). +![image](/attachments/985e0fa6-ec4a-4ad0-a1c7-d70f59e7a23d) + ## Space Saving Examples - 2.5GB MP4 to 500MB HEVC MP4 @@ -15,26 +17,24 @@ _Results vary and depend on the input video's format, bitrate etc._ ## Minimum System Requirements - PC with at least 2 cores -- Recent NVidia or AMD graphics card +- Recent Nvidia graphics card - Enough free disk space for resulting video files -**VITAL: ALWAYS check the resulting video files, ending with "(HEVC)" for expected length and try them out in a video player checking for quality and smooth playback.** ## Encoding During encoding (conversion) it is normal for high **CPU** and **GPU** usage. Be sure to only run the script when the PC has no other processes hogging up resources. -The script encodes the files alongside the original with (HEVC) at the end of the filename. +The script encodes the files alongside the original with '-HEVC' at the end or inplace x265 replacement of the string in the filename. +After the conversion, a test is performed on the new video file to ensure its integrity. +If this test is successful, the old file will be deleted. +If not, the failed conversion-file is deleted and registered. -## Decoding - -The resulting HEVC videos require a more powerful PC to decode and playback, than the original would. ## Script Usage -1. Download FFmpeg for Windows: https://ffmpeg.zeranoe.com/builds/ (see screenshots below) -2. Extract ffmpeg.exe to a known path/folder -3. Download **convert_Videos.ps1** and create **video_file_list.txt** alongside it -4. Make 4 edits in **convert_Videos.ps1** using PowerShell ISE -5. Copy+paste full paths into **video_file_list.txt** and save -6. Run **convert_Videos.ps1** to convert to HEVC +1. Clone this Repository to your computer +2. Download latest NVEnc for Windows: https://github.com/rigaya/NVEnc/releases +3. Extract the files to "video-in-place-hevc-converter\encoder\" and replace the old ones +4. Edit the $videoPath variable in the PowerShell file to point to your video-files folder +5. Run **convert_Videos.ps1** to convert all video Files on the provided path to HEVC. diff --git a/convert_Videos.ps1 b/convert_Videos.ps1 index efa217f..08860ee 100644 --- a/convert_Videos.ps1 +++ b/convert_Videos.ps1 @@ -1,12 +1,14 @@ # Converts videos to HEVC for given path: - -# Ref: https://trac.ffmpeg.org/wiki/Encode/H.265 # https://github.com/rigaya/NVEnc/releases +#----------------------------------------------------------------------- +# Edit the $videoPath variable to point to your video-files folder: + $videoPath = 'M:\2_serien\_main.series\Luther\' -# HEVC : main, main10, main444 +#----------------------------------------------------------------------- +# HEVC profiles: main, main10, main444 $profile = 'main10' $NVEncoder = "$PSScriptRoot\encoder\NVEncC64.exe" @@ -38,7 +40,7 @@ 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']) + # Get and check File info for codec, if it's already HEVC: - JSON query: (['media']['track'][1]['Format']) $fileDetails = cmd /c $fileTester $inputFile --Output=JSON | ConvertFrom-Json $codec = $fileDetails.media.track[1].Format #echo $codec @@ -60,7 +62,7 @@ foreach($video in $videos) $arguments = "--input `"$inputFile`" --codec hevc --audio-copy 1,2 --profile $profile --output `"$outputFile`"" - Start-Process $NVEncoder -ArgumentList $arguments #-WindowStyle Minimized + Start-Process $NVEncoder -ArgumentList $arguments -WindowStyle Minimized $processName = 'NVEncC64' Start-Sleep -Seconds 8 @@ -88,11 +90,12 @@ foreach($video in $videos) 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']): + # Check if File is valid; the duration of video must be the 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 + # This code gets the duration and splits it in two parts, only the part before the "." is needed: + $StreamSize_old,$notused = $($fileDetails.media.track[0].Duration).split('.') + $StreamSize_new,$notused = $($fileDetails_new.media.track[0].Duration).split('.') Write-Host Write-Host "Old Duration was: $StreamSize_old `nnew Duration is: $StreamSize_new" -ForegroundColor White @@ -101,7 +104,7 @@ foreach($video in $videos) if ($StreamSize_new -eq $StreamSize_old) { # Delete old video File! - Write-Host "Conversion Succesful! - Deleting old file.." + Write-Host "Conversion Successful! - Deleting old file.." Remove-Item -Path $inputFile } else {