Skip to content

Instantly share code, notes, and snippets.

@AlenVelocity
Created July 1, 2023 17:24
Show Gist options
  • Save AlenVelocity/799fafb628f591488f5b8c7b0b140e3f to your computer and use it in GitHub Desktop.
Save AlenVelocity/799fafb628f591488f5b8c7b0b140e3f to your computer and use it in GitHub Desktop.
$videoPath = Read-Host "Enter the input video path:"
$outputDirectory = Read-Host "Enter the output directory path:"
# Get the total duration of the video using FFprobe
$duration = & ffprobe.exe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $videoPath
# Convert the duration to seconds
$durationSeconds = [math]::Round($duration, 0)
# Calculate the number of parts based on a 30-second duration
$numberOfParts = [math]::Floor($durationSeconds / 30)
# Calculate the duration of the last part
$lastPartDurationSeconds = $durationSeconds % 30
# Create the output directory if it doesn't exist
if (-not (Test-Path $outputDirectory)) {
New-Item -ItemType Directory -Path $outputDirectory | Out-Null
}
# Split the video into parts
for ($i = 0; $i -lt $numberOfParts; $i++) {
$startTime = $i * 30
$outputFileName = "part_$i.mp4"
$outputFilePath = Join-Path -Path $outputDirectory -ChildPath $outputFileName
# Use FFmpeg to split the video
ffmpeg.exe -i $videoPath -ss $startTime -t 30 -c copy -avoid_negative_ts 1 $outputFilePath
# Check the size of the output file
$outputFileSize = (Get-Item $outputFilePath).Length / 1MB
# If the size is larger than 14 MB, re-encode the video with a lower bitrate
if ($outputFileSize -gt 14) {
$outputFileName = "part_$i_reencoded.mp4"
$outputFilePath = Join-Path -Path $outputDirectory -ChildPath $outputFileName
# Use FFmpeg to re-encode the video with a lower bitrate
ffmpeg.exe -i $outputFilePath -b:v 1M $outputFilePath
# Check the size of the re-encoded output file
$outputFileSize = (Get-Item $outputFilePath).Length / 1MB
# If the re-encoded size is still larger than 14 MB, display a warning
if ($outputFileSize -gt 14) {
Write-Warning "The re-encoded video '$outputFileName' is still larger than 14 MB."
}
}
}
# Split the last part
$outputFileName = "part_$numberOfParts.mp4"
$outputFilePath = Join-Path -Path $outputDirectory -ChildPath $outputFileName
# Use FFmpeg to split the last part of the video
ffmpeg.exe -i $videoPath -ss ($numberOfParts * 30) -t $lastPartDurationSeconds -c copy -avoid_negative_ts 1 $outputFilePath
# Check the size of the last part file
$outputFileSize = (Get-Item $outputFilePath).Length / 1MB
# If the size is larger than 14 MB, re-encode the video with a lower bitrate
if ($outputFileSize -gt 14) {
$outputFileName = "part_$numberOfParts_reencoded.mp4"
$outputFilePath = Join-Path -Path $outputDirectory -ChildPath $outputFileName
# Use FFmpeg to re-encode the last part of the video with a lower bitrate
ffmpeg.exe -i $outputFilePath -b:v 1M $outputFilePath
# Check the size of the re-encoded last part file
$outputFileSize = (Get-Item $outputFilePath).Length / 1MB
# If the re-encoded size is still larger than 14 MB, display a warning
if ($outputFileSize -gt 14) {
Write-Warning "The re-encoded last part video '$outputFileName' is still larger than 14 MB."
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment