把ps1 放到影片旁邊
對著ps1按右鍵 → 用 PowerShell 執行
Win10 適用
getMp4Pic 用法
#預設值:從 0:0:0 開始截圖,截圖到結束,間隔 0:1:0 一分鐘
getMp4Pic 'C:\3.mp4' -start 0 -end -1 -step 0:1:0 -w 0 -h 0
#效果同上。可省略其他參數。
getMp4Pic 'C:\3.mp4'
#只截一張圖 0:0:5
getMp4Pic 'C:\3.mp4' 0:0:5 0:0:5
#從 0:0:5 開始截圖,截圖到結束,間隔 0:0:30 三十秒
getMp4Pic 'C:\3.mp4' 0:0:5 -step 0:0:30
#從 0:0:5 開始截圖,截圖到0:3:0,間隔 0:1:0 一分鐘
getMp4Pic 'C:\3.mp4' 0:0:5 0:3:0
#從 0:0:5 開始截圖,截圖到0:3:0,間隔 0:0:20 二十秒
getMp4Pic 'C:\3.mp4' 0:0:5 0:3:0 0:0:20
#設定長度、寬度
getMp4Pic 'C:\3.mp4' 0:0:5 0:3:0 0:0:20 -w 640 -h 480
function getMp4Pic{
param(
[io.fileinfo]$mp4,
[timespan]$startTime = '0:0:0' ,
[timespan]$endTime = '-1' ,
[timespan]$step = '0:1:0' ,
[uint32]$width = 0 ,
[uint32]$height = 0
)
#learn from https://fleexlab.blogspot.com/2018/02/using-winrts-iasyncoperation-in.html
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() |
? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and
$_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' } )[0]
Function Await($WinRtTask, $ResultType) {
$asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
$netTask = $asTask.Invoke($null, @($WinRtTask))
$netTask.Wait(-1) | Out-Null
$netTask.Result
}
#http://blog.bagusandryan.com/get-video-thumbnail-storagefile-uwp-732/
#https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/imaging
[Windows.Storage.StorageFile , Windows.Storage , ContentType=WindowsRuntime] > $null
[Windows.Media.Editing.MediaComposition , Windows.Media.Editing , ContentType=WindowsRuntime] > $null
[Windows.Graphics.Imaging.ImageStream , Windows.Graphics.Imaging , ContentType=WindowsRuntime] > $null
$xmlPath = Join-Path $mp4.DirectoryName "MediaClip11111xml.xml"
$mp4PathInXml = "$mp4" -replace '&','&'
@"
<?xml version="1.0" encoding="UTF-8"?>
<Composition>
<Clips>
<MediaClip Path="$mp4PathInXml" />
</Clips>
</Composition>
"@ | sc -Literal $xmlPath -Enc UTF8
# "@ must at begin of line
$a = [Windows.Storage.StorageFile]
$xmlFile = await ($a::GetFileFromPathAsync($xmlPath)) ($a)
#===== MediaComposition =====
$a = [Windows.Media.Editing.MediaComposition]
$m01 = await ($a::LoadAsync($xmlFile)) ($a)
$NearestKeyFrame = 1
if ($endTime -eq '-1'){ $endTime = $m01.Clips.OriginalDuration }
$outFolder = Join-Path $mp4.DirectoryName ($mp4.BaseName + "_$startTime" -replace ':','_')
md $outFolder 2>$null >$null
for ($time = $startTime; $time -le $endTime; $time += $step){
$a = [Windows.Graphics.Imaging.ImageStream]
$mp4Thumb = await ($m01.GetThumbnailAsync($time, $width, $height, $NearestKeyFrame)) ($a)
$reader = [Windows.Storage.Streams.DataReader]::new($mp4Thumb.GetInputStreamAt(0))
$reader.LoadAsync($mp4Thumb.Size) > $null
$bytes = new-object byte[] ($mp4Thumb.Size)
$reader.ReadBytes($bytes)
#out
$outName = $mp4.BaseName + ("_$time" -replace ':','_') + '.jpg'
$outPath = Join-Path $outFolder $outName
[System.IO.File]::WriteAllBytes($outPath, $bytes)
}
del $xmlPath
}
#=======
cd -literal $PSScriptRoot
[Environment]::CurrentDirectory = pwd
$files = @(dir *.mp4,*.mkv -file)
if ($files.count -ne 0){
getMp4Pic $files[0] -start 0:0:5 -end 0:0:5 # -step 0:0:20 -w 640 -h 480
}
沒有留言:
張貼留言