Skip to content

Instantly share code, notes, and snippets.

@HunterAP23
Last active October 21, 2023 06:58
Show Gist options
  • Save HunterAP23/7a8657ec82ef1430fb751acaeea0fc59 to your computer and use it in GitHub Desktop.
Save HunterAP23/7a8657ec82ef1430fb751acaeea0fc59 to your computer and use it in GitHub Desktop.
Convert Media Sources to lossless VP9 WEBM with transparency
@echo off
setlocal EnableDelayedExpansion
for %%a in (*.webm *.mkv) do (
FOR /F "usebackq" %%F IN (`ffprobe -v error -select_streams v:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 "%%a"`) DO (
if "%%F"=="vp8" (
ffmpeg -hide_banner -c:v libvpx -i "%%a" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k "%%~dpna_VP9.webm"
) else (
if "%%F"=="vp9" (
ffmpeg -hide_banner -c:v libvpx-vp9 -i "%%a" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k "%%~dpna_VP9.webm"
) else (
ffmpeg -hide_banner -i "%%a" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k "%%~dpna_VP9.webm"
)
)
)
)
for %%a in (*.mp4 *.mov *.avi) do (
ffmpeg -hide_banner -i "%%a" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k "%%~dpna_VP9.webm"
)
$loc = $args[0]
If ($args.length -eq 0) {
"Defaulting to current directory of `"$(Get-Location)`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
} ElseIf ( $(Try { Test-Path $args[0].trim() } Catch { $false }) ) {
"Path `"$loc`" was found." | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
} Else {
"Path `"$loc`" was not found." | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
exit
}
@(Get-ChildItem -Path $loc -File -Filter *.webm).foreach({
If ($_ -notmatch "_VP9.webm") {
"Working on file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
$pat = Split-Path ($_).FullName
$codec = ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$_"
$new = "$pat\$(($_).BaseName)_VP9.webm"
If ($codec -eq "vp8") {
ffmpeg -hide_banner -hwaccel auto -c:v libvpx -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
"Finished file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
} ElseIF ($codec -eq "vp9") {
# ffmpeg -hide_banner -hwaccel auto -c:v libvpx-vp9 -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
"File `"$_`" is already in VP( WEBM) format - skipping..." | Out-File -append -noClobber -encoding UTF8 -filepath "$(Get-Location)\media_to_vp9.log"
} Else {
ffmpeg -hide_banner -hwaccel auto -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
"Finished file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
}
}
})
@(Get-ChildItem -Path $loc -File -Filter *.mov).foreach({
"Working on file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
$pat = Split-Path ($_).FullName
$new = "$pat\$(($_).BaseName)_VP9.webm"
ffmpeg -hide_banner -hwaccel auto -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
"Finished file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
})
@(Get-ChildItem -Path $loc -File -Filter *.mp4).foreach({
"Working on file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
$pat = Split-Path ($_).FullName
$new = "$pat\$(($_).BaseName)_VP9.webm"
ffmpeg -hide_banner -hwaccel auto -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
"Finished file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
})
@(Get-ChildItem -Path $loc -File -Filter *.mkv).foreach({
"Working on file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
$pat = Split-Path ($_).FullName
$codec = ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$_"
$new = "$pat\$(($_).BaseName)_VP9.webm"
If ($codec -eq "vp8") {
ffmpeg -hide_banner -hwaccel auto -c:v libvpx -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
} ElseIF ($codec -eq "vp9") {
ffmpeg -hide_banner -hwaccel auto -c:v libvpx-vp9 -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
} Else {
ffmpeg -hide_banner -hwaccel auto -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
}
"Finished file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
})
@(Get-ChildItem -Path $loc -File -Filter *.avi).foreach({
"Working on file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
$pat = Split-Path ($_).FullName
$new = "$pat\$(($_).BaseName)_VP9.webm"
ffmpeg -hide_banner -hwaccel auto -i "$(($_).FullName)" -pix_fmt yuva420p -c:v libvpx-vp9 -crf 0 -b:v 0 -lossless 1 -row-mt 1 -tile-columns 6 -tile-rows 2 -frame-parallel 1 -c:a libopus -b:a 96k -y "$new"
"Finished file `"$_`"" | Tee-Object -Append -filepath "$(Get-Location)\media_to_vp9.log"
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment