教程:使用PowerShell截取视频帧并创建图像网格

在数字时代,视频内容越来越受欢迎,而在处理视频时,截取视频帧并创建图像网格是一个常见的需求。你可能希望制作视频预览图,创建视频摘要,或者仅仅想要展示视频的某些关键帧。无论你的用途是什么,本教程将向你展示如何使用PowerShell来截取视频帧,并将这些帧组合成一个漂亮的图像网格。

背景故事

在我们开始之前,让我为你讲一个故事。想象一下,你是一位视频制作爱好者,最近完成了一部精彩的短片。你想要在社交媒体上分享这个视频,并吸引更多观众。为了吸引人们的眼球,你决定制作一个有吸引力的视频封面,展示你的视频的精彩瞬间。然而,你发现市面上的封面制作工具无法满足你的需求。于是,你决定自己动手,使用PowerShell来截取视频帧并创建一个个性化的图像网格。让我们一起来完成这个任务吧!

准备工作

在开始之前,确保你已经安装了FFmpeg工具,因为它将用于视频帧的截取和图像的合并。你可以从FFmpeg官方网站下载并安装它。

此外,确保你的视频文件位于同一个目录下,并且它们的文件类型是.mp4.mkv。现在,让我们逐步进行操作。

步骤1:准备PowerShell脚本

首先,你需要创建一个名为extract_frames.ps1的PowerShell脚本文件。你可以使用任何文本编辑器,如Notepad,来创建这个文件。

$files = Get-ChildItem *.mp4,*.mkv
foreach ($file in $files) {
    # 定义函数以获取视频时长
    function Get-VideoDuration($file) {
        $ffmpegOutput = & ffmpeg -i $file 2>&1
        $durationMatch = [regex]::Match($ffmpegOutput, 'Duration: (\d+:\d+:\d+\.\d+)')
        if ($durationMatch.Success) {
            $duration = $durationMatch.Groups[1].Value
            $timeComponents = $duration -split ':'
            $durationInSeconds = [int]$timeComponents[0] * 3600 + [int]$timeComponents[1] * 60 + [math]::Round([double]$timeComponents[2])
            return $durationInSeconds
        }
        return 0
    }
    #文件
    $fileRootPath = $file.Name
    #$fileRootPath = Read-Host "名称带文件类型"
    #$fileRootPath = ""
    $time = Get-VideoDuration $fileRootPath
    #Write-Host "视频时长:$time 秒"

    # 获取视频时长
    $durationInSeconds = Get-VideoDuration $fileRootPath

    # 计算截取的时间点,从第10秒开始,平均分成9帧
    $frameTimes = @()
    for ($i = 0; $i -lt 9; $i++) {
        $frameTimes += [math]::Round(10 + $durationInSeconds / 9 * $i)
    }

    # 定义文件路径和参数
    $outputPath = "img"
    New-Item -Path ./$outputPath -ItemType Directory -Force
    # 生成创建图像的命令 -n 是跳过 -y是覆盖
    for ($i = 0; $i -lt 9; $i++) {
        $command = "ffmpeg -ss " + $frameTimes[$i] + " -i `"$fileRootPath`" -vframes 1 -q:v 2 " + $outputPath + "\frame_$i.jpg"
        Invoke-Expression $command
        Write-Host "已截取图像 $i"
    }

    # 合并截取的图像成图像网格
    # 获取文件大小
    $fileInfo = Get-Item $file.Name
    $fileSizeBytes = $fileInfo.Length
    $fileSizeGB = [math]::Round($fileSizeBytes / 1GB, 2)  # 转换为千兆字节

    # 转换时间
    $hours = [math]::floor($time / 3600)  # 计算小时
    $minutes = [math]::floor(($time % 3600) / 60)  # 计算分钟
    $seconds = $time % 60  # 计算剩余的秒数

    $名称 =$file.Name -replace ".mp4|.mkv", ""

    # 水印图像文件路径
    $watermarkImage = "D:/Software/O.png"
    #$watermarkImage = "E:/O.png"

    # 合并图像和水印
    $font = "D:/Software/ios.ttf"
    #$font = "E:/ios.ttf"
    $text = "名      称:$名称`n视频时长:$hours 小时 $minutes 分钟 $seconds 秒`n大      小:$fileSizeGB.GB"
    $标题 = "$名称"
    $视频时长 = "视频时长:$hours 小时 $minutes 分钟 $seconds 秒"
    $大小 = "大小:$fileSizeGB.GB"
    $outputFileName = "$fileRootPath.jpg"

    $mergeCommand = "ffmpeg -y -i `"$outputPath\frame_%d.jpg`" -i $watermarkImage -filter_complex `"
    [0:v]scale=-1:468,drawbox=x=0:y=0:w=iw:h=ih:c=white:t=10,tile=3x3,
    pad=iw:ih+155:0:155:white,drawtext=text='$text':fontfile='$font':fontsize=35:fontcolor=black:x=600:y=30[bg];
    [bg][1:v]overlay=10:10`" `"$outputFileName`""

    Invoke-Expression $mergeCommand

    Remove-Item -Path .\$outputPath -Recurse #删除图片
    Write-Host "图像网格创建完成。"
}

步骤2:执行PowerShell脚本

现在,打开PowerShell终端,导航到包含extract_frames.ps1脚本的目录,并运行以下命令来执行脚本:

.\extract_frames.ps1

脚本将开始运行,并在完成后生成图像网格。你可以在脚本中根据需要进行自定义设置,比如截取的帧数、截取的时间点等。

结果和进一步定制

一旦脚本运行完成,你将在同一目录下找到生成的图像网格文件,文件名为视频文件名加上.jpg扩展名。这个图像网格将包含9个图像帧,呈3x3的排列,并带有自定义的水印和视频信息。

你可以根据需要进一步定制脚本,比如更改水印图像、字体、字体大小等,以满足你的具体需求。

总结

通过这个教程,你学会了如何使用PowerShell脚本来截取视频帧并创建图像网格。这个技巧可以用于制作吸引人的视频封面、视频摘要或其他需要展示视频关键帧的场景。希望你能在自己的项目中成功应用这个技巧!

现在,你可以轻松地为你的视频内容制作引人注目的图像网格,让它们在社交媒体上脱颖而出。

声明:本站所有文章,如无特殊说明或标注,均为本站(王大神)原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
指数词

人工智能之父:图灵的智慧遗产

2023-10-16 23:07:34

指数词

如何提高隔着一堵墙的电视盒子网络连接

2023-10-16 23:16:32

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索