×
¥
查看详情
🔥 会员专享 文生文 其它

视频末帧提取专家

👁️ 295 次查看
📅 Nov 4, 2025
💡 核心价值: 本提示词专为视频处理场景设计,能够智能解析视频文件并精准提取最后一帧画面。通过结构化参数配置,支持多种输出格式与分辨率设置,确保帧提取过程高效准确。特别适用于视频编辑、内容分析与机器学习等领域,帮助用户快速获取关键帧数据,提升视频处理效率与质量。亮点包括自适应视频解析、多格式输出支持及智能错误处理,满足专业级视频帧提取需求。

🎯 可自定义参数(3个)

视频路径
视频文件完整路径,例如:D:/视频/宣传片.mp4
输出格式
输出图像格式,例如:JPEG、PNG
分辨率
输出分辨率设置,例如:1920x1080

🎨 效果示例

以下为可复现、无损(PNG)且能“保证取到视频最后一帧”的处理方案。受限于我无法直接访问你本地文件,我提供一键脚本与快速命令。执行后脚本会自动输出你所需的处理报告(含时长/帧率/末帧时间戳/输出文件大小/处理时长),并严格不修改原视频。

使用说明(Windows/PowerShell)

  • 先安装 FFmpeg(含 ffprobe),并将其加入 PATH。
    • 快捷安装:winget install Gyan.FFmpeg 或 choco install ffmpeg
  • 将下面整段脚本复制到 PowerShell 执行(以管理员或普通用户均可)

一键末帧提取与报告脚本(PowerShell)

  • 输出:PNG
  • 分辨率:1920x1080(保持画面不变形,自动等比缩放并补边)
  • 保真:PNG 无损;采用 Lanczos 高质量缩放
# -------- 配置区域 --------
$inputPath = "D:/素材/品牌宣传片/春季上新_完整版.mp4"
$outputPath = "D:/素材/品牌宣传片/春季上新_完整版_lastframe_1920x1080.png"
$targetW = 1920
$targetH = 1080
$seekTailSec = 0.050   # 快速法:自文件尾部回溯 50ms 定位末帧;如不严谨将自动走保底法
# -------------------------

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$ErrorActionPreference = 'Stop'

function Convert-FractionToDouble([string]$s) {
  if ([string]::IsNullOrWhiteSpace($s)) { return $null }
  if ($s -match '^(\d+)/(\d+)$') { return [double]$Matches[1] / [double]$Matches[2] }
  try { return [double]$s } catch { return $null }
}
function Format-Time([double]$sec) { return [TimeSpan]::FromSeconds($sec).ToString("hh\:mm\:ss\.fff") }

if (-not (Test-Path -LiteralPath $inputPath)) {
  Write-Output "处理状态:失败"
  Write-Output "源视频信息:文件不存在或不可读"
  Write-Output "末帧详情:N/A"
  Write-Output "输出文件:N/A"
  Write-Output "质量报告:N/A"
  exit 1
}

$sw = [System.Diagnostics.Stopwatch]::StartNew()

# 读取元数据
$ffprobeJson = & ffprobe -v error -hide_banner `
  -select_streams v:0 `
  -show_entries stream=width,height,avg_frame_rate,nb_frames,duration `
  -show_entries format=duration `
  -of json `
  "$inputPath"
if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($ffprobeJson)) { throw "无法读取视频元数据" }
$meta = $ffprobeJson | ConvertFrom-Json
$vs = $meta.streams | Select-Object -First 1
$fmtDur = [double]($meta.format.duration)
$stmDur = [double]($vs.duration)
$durationSec = if ($fmtDur -gt 0) { $fmtDur } elseif ($stmDur -gt 0) { $stmDur } else { $null }
$srcW = [int]$vs.width
$srcH = [int]$vs.height
$fps = Convert-FractionToDouble $vs.avg_frame_rate
if (-not $fps -or $fps -le 0) { $fps = Convert-FractionToDouble $vs.r_frame_rate }
$fpsDisp = if ($fps) { "{0:N3}" -f $fps } else { "未知" }
$nbFrames = if ($vs.nb_frames) { [int]$vs.nb_frames } else { $null }

# 过滤器:等比缩放到不超过 1920x1080,并补黑边到刚好 1920x1080,保证不变形
$filter = "scale=$targetW:$targetH:flags=lanczos:force_original_aspect_ratio=decrease,pad=$targetW:$targetH:(ow-iw)/2:(oh-ih)/2:color=black,setsar=1,showinfo"

# 方法A(快速):从文件尾回溯 seekTailSec 秒定位末帧,抓取1帧
$fastLog = & ffmpeg -hide_banner -sseof "-$seekTailSec" -i "$inputPath" -map v:0 -frames:v 1 `
  -an -sn -dn -vf $filter -pix_fmt rgb24 -compression_level 9 -y "$outputPath" 2>&1

$success = $false
$usedSlow = $false
$ptsTime = $null
$frameIndex = $null

if ($LASTEXITCODE -eq 0) {
  $m = ($fastLog | Select-String -Pattern 'showinfo.*n:\s*(\d+).+pts_time:(\d+(?:\.\d+)?)' -AllMatches).Matches | Select-Object -Last 1
  if ($m) {
    $frameIndex = [int]$m.Groups[1].Value
    $ptsTime = [double]$m.Groups[2].Value
    # 校验是否为末帧:若 nb_frames 已知,用 (nb_frames-1) 校验;否则用接近 duration 校验
    $isLastByCount = ($nbFrames -and $frameIndex -ge ($nbFrames - 1))
    $threshold = if ($fps -and $fps -gt 0) { 1.0 / $fps + 0.005 } else { 0.050 }
    $isNearEndByTime = ($durationSec -and $ptsTime -ge ($durationSec - $threshold))
    if ($isLastByCount -or $isNearEndByTime) { $success = $true }
  }
}

# 方法B(保底,100% 末帧):全量解码 + 单文件覆盖,仅保留最后一帧
if (-not $success) {
  $usedSlow = $true
  $slowLog = & ffmpeg -hide_banner -v error -i "$inputPath" -map v:0 -vf $filter `
    -vsync 0 -f image2 -update 1 -pix_fmt rgb24 -compression_level 9 -y "$outputPath" 2>&1
  if ($LASTEXITCODE -ne 0) { throw "保底法提取失败" }
  $m2 = ($slowLog | Select-String -Pattern 'showinfo.*n:\s*(\d+).+pts_time:(\d+(?:\.\d+)?)' -AllMatches).Matches | Select-Object -Last 1
  if ($m2) {
    $frameIndex = [int]$m2.Groups[1].Value
    $ptsTime = [double]$m2.Groups[2].Value
    $success = $true
  } else {
    # 某些构建将 showinfo 打到 stderr/hide_banner 影响匹配,尝试从 fastLog 兜底
    $success = Test-Path -LiteralPath $outputPath
  }
}

$sw.Stop()

if (-not $success) {
  Write-Output "处理状态:失败"
  Write-Output "源视频信息:时长=$([string]::IsNullOrWhiteSpace($durationSec)?'未知':(Format-Time $durationSec)),分辨率=$srcWx$srcH,帧率=$fpsDisp"
  Write-Output "末帧详情:N/A"
  Write-Output "输出文件:路径=$outputPath,格式=PNG,大小=N/A"
  Write-Output "质量报告:未能提取末帧;处理时长=$($sw.Elapsed.ToString())"
  exit 2
}

# 输出结果文件信息
$outFile = Get-Item -LiteralPath $outputPath
$outSize = "{0:N0} 字节" -f $outFile.Length
$durationTxt = if ($durationSec) { Format-Time $durationSec } else { "未知" }
$ptsTxt = if ($ptsTime) { Format-Time $ptsTime } else { "未知" }
$srcResTxt = if ($srcW -and $srcH) { "$($srcW)x$($srcH)" } else { "未知" }
$methodTxt = if ($usedSlow) { "全量解码覆盖写出(保证末帧)" } else { "末尾定位提取(已校验接近视频结束)" }
$precisionTxt = if ($nbFrames) {
  if ($frameIndex -ge ($nbFrames - 1)) { "通过帧计数校验:n=$frameIndex ≈ nb_frames-1=$($nbFrames-1)" }
  else { "通过时间戳校验:pts≈$ptsTxt,接近时长 $durationTxt" }
} else {
  "通过时间戳校验:pts≈$ptsTxt,接近时长 $durationTxt"
}

# —— 按要求输出 Markdown 报告 ——
Write-Output "处理状态:成功"
Write-Output "源视频信息:时长=$durationTxt,分辨率=$srcResTxt,帧率=$fpsDisp"
Write-Output "末帧详情:时间戳=$ptsTxt,图像尺寸=$($targetW)x$($targetH)"
Write-Output "输出文件:保存路径=$($outFile.FullName),格式=PNG,大小=$outSize"
Write-Output "质量报告:提取精度=$methodTxt($precisionTxt);处理时长=$($sw.Elapsed.ToString())"

快速一行命令(不生成报告;适合已知可行的场景)

  • 若不需要自动校验与报告,可直接运行:
ffmpeg -hide_banner -sseof -0.05 -i "D:/素材/品牌宣传片/春季上新_完整版.mp4" -map v:0 -frames:v 1 -an -sn -dn -vf "scale=1920:1080:flags=lanczos:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=black,setsar=1" -pix_fmt rgb24 -compression_level 9 -y "D:/素材/品牌宣传片/春季上新_完整版_lastframe_1920x1080.png"
  • 如需“100%末帧”保障(但较慢):
ffmpeg -hide_banner -v error -i "D:/素材/品牌宣传片/春季上新_完整版.mp4" -map v:0 -vf "scale=1920:1080:flags=lanczos:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=black,setsar=1" -vsync 0 -f image2 -update 1 -pix_fmt rgb24 -compression_level 9 -y "D:/素材/品牌宣传片/春季上新_完整版_lastframe_1920x1080.png"

注意与合规

  • 不修改原视频文件;仅读取并导出 PNG。
  • 不存储或回传你的源视频数据。
  • 若视频为受版权保护或加密内容,请勿处理。

当前处理状态(等待你执行脚本后即可得到最终报告)

  • 处理状态:待执行
  • 源视频信息:待获取
  • 末帧详情:待获取
  • 输出文件:计划路径 D:/素材/品牌宣传片/春季上新_完整版_lastframe_1920x1080.png;格式 PNG
  • 质量报告:待生成

运行完成后,将脚本输出的整段报告粘贴给我,我可复核并给出进一步优化建议(如改为填充白边/透明边、或改为居中裁剪以满铺 1920x1080)。

  • 处理状态:失败(原因:未提供有效的分辨率参数“#{resolution}”,且当前环境无法直接访问指定文件路径进行读取与解析)

  • 源视频信息:待获取(需读取文件元数据后填写:时长、分辨率、帧率)

  • 末帧详情:待提取(需完成解码后生成:时间戳、图像尺寸)

  • 输出文件:计划保存路径:/data/monitor/lotA/cam2/2025-09-12_23-00-00_last.jpg;格式:JPEG;大小:待生成

  • 质量报告:

    • 提取精度:待执行。将采用双策略确保末帧精准提取:
      1. 精确帧索引法(首选,需统计总帧数)
        • 使用 ffprobe 统计视频总帧数 N: ffprobe -v error -select_streams v:0 -count_frames -show_entries stream=nb_read_frames,avg_frame_rate,width,height,duration,codec_name -print_format json "/data/monitor/lotA/cam2/2025-09-12_23-00-00.mkv"
        • 提取第 N-1 帧(保持时间戳对齐): ffmpeg -v error -i "/data/monitor/lotA/cam2/2025-09-12_23-00-00.mkv" -vf "select='eq(n,N-1)'" -vsync vfr -frames:v 1 [可选scale] -q:v 1 "/data/monitor/lotA/cam2/2025-09-12_23-00-00_last.jpg"
        • 注:当 nb_read_frames 不可用时切换到策略 2。
      2. 末尾偏移法(高效回退方案)
        • 从文件末尾回退极小偏移并解码首帧: ffmpeg -v error -hide_banner -sseof -0.001 -i "/data/monitor/lotA/cam2/2025-09-12_23-00-00.mkv" -map 0:v:0 -frames:v 1 [可选scale] -q:v 1 "/data/monitor/lotA/cam2/2025-09-12_23-00-00_last.jpg"
        • 若容器/索引导致偏移不足,自动放宽偏移至 -0.5 秒重试。
    • 处理时长:待执行(取决于视频长度与 I/O 性能)
    • 合规性与安全:
      • 不修改原始视频数据,仅读取与解码
      • 不存储未经授权的用户视频数据
      • 若视频为加密或受版权保护内容,将停止处理
      • 输出图像将遵循 JPEG 标准,不含敏感或违规内容(无法提前识别,需用户确认使用场景)

请补充或确认以下信息以继续:

  1. 分辨率设置:请将“#{resolution}”替换为目标尺寸(例如 1920x1080、1280x720),或回复“保持原始分辨率”。
  2. 运行环境:确认我可读取路径 /data/monitor/lotA/cam2/2025-09-12_23-00-00.mkv,或请上传视频文件/授权临时访问。
  3. 是否允许将输出保存为 /data/monitor/lotA/cam2/2025-09-12_23-00-00_last.jpg(可自定义路径)。
  4. 确认视频不为加密或受版权限制的内容。
  • 处理状态:失败(缺少明确的输出格式参数,且我无法直接访问本地路径执行提取)
  • 源视频信息:无法获取(需本地探测)
    • 时长:待探测
    • 分辨率:待探测
    • 帧率:待探测
  • 末帧详情:
    • 时间戳:待提取
    • 图像尺寸:1280x720(按你的要求进行输出处理)
  • 输出文件:
    • 保存路径:待生成(建议与源视频同目录,例如:E:/课程录制/机器学习入门/第10讲_模型评估_lastframe.{ext})
    • 格式:待确认(请在 PNG/JPEG/WebP/TIFF 中指定)
    • 大小:待生成
  • 质量报告:
    • 提取精度:待检测(将采用“按总帧数精准定位”优先方案,失败时自动回退到“末尾快速定位”方案)
    • 处理时长:待统计

请确认以下两点后,我将生成最终结果与完整报告:

  1. 输出格式 output_format(建议 PNG 以保持无损画质;若需更小体积可选 JPEG/WebP)
  2. 是否允许我给出一键脚本在你的本地执行(Windows/PowerShell + ffmpeg/ffprobe)

如果你希望立即本地执行,按下述步骤操作(Windows,需已安装 ffmpeg 6.x 及以上):

  • 步骤说明(精准且容错)

    1. 精准法:用 ffprobe统计总帧数 nb_read_frames,按索引提取最后一帧(绝对准确,代价是全片解码一次)
    2. 快速法:用 -sseof 从末尾极近处读取并抓取最后一帧(高效,但个别容器可能差一帧;作为回退)
  • PowerShell 脚本(复制后把 $ext 改为你要的输出格式:png/jpg/webp/tiff) $input = "E:/课程录制/机器学习入门/第10讲_模型评估.mov" $ext = "png" # 请改为你希望的格式:png/jpg/webp/tiff $out = "E:/课程录制/机器学习入门/第10讲_模型评估_lastframe.$ext"

    if (!(Test-Path $input)) { Write-Error "源视频不存在:$input"; exit 1 }

    解析元数据与总帧数(精准)

    $nb = (ffprobe -v error -select_streams v:0 -count_frames -show_entries stream=nb_read_frames -of csv=p=0 "$input") if ([string]::IsNullOrWhiteSpace($nb) -or [int]$nb -le 0) {

    某些容器不返回 nb_read_frames,尝试备用字段

    $nb = (ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of csv=p=0 "$input") } if ([string]::IsNullOrWhiteSpace($nb) -or [int]$nb -le 0) { Write-Warning "无法获取总帧数,将使用快速法提取"; $nb = $null }

    输出缩放过滤器:保持原始比例,铺满1280x720画布(不拉伸)

    $scalePad = "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2"

    精准法:按索引定位最后一帧

    if ($nb) { $lastIndex = ([int]$nb - 1) $filters = "select=eq(n,$lastIndex),$scalePad" ffmpeg -v error -i "$input" -vf "$filters" -vsync vfr -frames:v 1 "$out" }

    快速法回退:从末尾极近处抓取一帧

    if (!(Test-Path $out) -or (Get-Item $out).Length -eq 0) { ffmpeg -v error -sseof -0.2 -i "$input" -vf "$scalePad" -frames:v 1 "$out" }

    提取末帧的时间戳(报告用)

    $lastTs = (ffprobe -v error -select_streams v:0 -read_intervals "%+#1" -show_entries frame=best_effort_timestamp_time -of csv=p=0 "$input" | Select-Object -Last 1)

    源视频基本信息(报告用)

    $info = ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,avg_frame_rate -show_entries format=duration -of json "$input" $meta = $info | ConvertFrom-Json $duration = [double]$meta.format.duration $stream = $meta.streams[0] $w = $stream.width $h = $stream.height $fps = $stream.avg_frame_rate

    if (Test-Path $out) { $size = (Get-Item $out).Length Write-Host "处理状态:成功" Write-Host "源视频信息:时长=${duration}s,分辨率=${w}x${h},帧率=${fps}" Write-Host "末帧详情:时间戳=$lastTs,图像尺寸=1280x720" Write-Host "输出文件:路径=$out,格式=$ext,大小=$size 字节" Write-Host "质量报告:提取精度=高(已进行精准/快速双重策略),处理时长=视机器性能而定" } else { Write-Error "提取失败,请将日志与视频基本信息反馈以便进一步诊断" }

说明与合规提示:

  • 不修改原始视频,只读解码并生成图像文件,符合你的规则2。
  • 建议使用 PNG 输出以保持原始画质;JPEG/WebP 可指定质量参数(例如 -q:v 2 或 -compression_level 6)。
  • 若视频为可变帧率或少数编码/封装不返回 nb_read_frames,脚本会回退到末尾快速提取确保效率。
  • 请确认该视频不涉及受版权或加密保护内容,符合规则1与3。
  • 我不会在未授权情况下存储你的视频数据,符合规则4。

请回复:

  • output_format(例如:PNG)
  • 是否按上述脚本执行,或希望我根据你的平台与工具链(Python/OpenCV 或 FFmpeg)提供定制方案。

示例详情

📖 如何使用

30秒出活:复制 → 粘贴 → 搞定
与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡!
加载中...
💬 不会填参数?让 AI 反过来问你
不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。
转为对话模式
🚀 告别复制粘贴,Chat 里直接调用
无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。
即将推出
🔌 接口一调,提示词自己会进化
手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。
发布 API
🤖 一键变成你的专属 Agent 应用
不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。
创建 Agent

✅ 特性总结

一键提取视频末帧,保持原画质,直出封面/缩略图/分析基准,用于多场景发布。
自适应解析各类视频源,自动识别时长与帧率,精准定位到最后一帧。
多格式输出随选,JPG/PNG/WebP等一键切换,满足平台上传与设计交付。
支持分辨率自定义与等比缩放,自动优化清晰度与体积,兼顾速度与画质。
智能错误处理与过程校验,遇到损坏文件或异常帧,给出可执行修复建议。
自动生成处理报告,包含时长、分辨率、时间戳与耗时,便于留档与复核。
全程本地化处理与隐私保护,不保存用户视频,适配合规审核要求。
开箱即用的参数模板,按需填入路径、格式与尺寸,小白也能稳定复用。
面向编辑、研究与训练场景,快速抽取关键末帧,缩短工作流等待时间。
跨平台结果一致性保障,避免色彩偏差与拉伸失真,确保交付可比对。

🎯 解决的问题

让每一位剪辑师、运营、研究人员与算法工程师,都能在数秒内稳定获取“视频最后一帧”,一键输出为封面、审阅留档或训练样本。通过自适应素材识别、多格式与分辨率可选、品质不损的导出和过程记录,打造标准化、可复用的末帧提取流程,显著减少手动拉帧与反复导出的时间成本与出错率。适用场景包括:短视频与宣传片封面定格、广告片尾画面外发、监控结尾画面取证与分析、课程视频封面与章节首图、数据集末帧标注与质检。核心价值:更快交付、更稳结果、更好画质、更易协同、更可追溯。试用导向:开箱即用即可出图;进阶付费可解锁批量处理、预设管理、合规日志与团队协作能力,全面提升产能与交付质量。

🕒 版本历史

当前版本
v2.1 2024-01-15
优化输出结构,增强情节连贯性
  • ✨ 新增章节节奏控制参数
  • 🔧 优化人物关系描述逻辑
  • 📝 改进主题深化引导语
  • 🎯 增强情节转折点设计
v2.0 2023-12-20
重构提示词架构,提升生成质量
  • 🚀 全新的提示词结构设计
  • 📊 增加输出格式化选项
  • 💡 优化角色塑造引导
v1.5 2023-11-10
修复已知问题,提升稳定性
  • 🐛 修复长文本处理bug
  • ⚡ 提升响应速度
v1.0 2023-10-01
首次发布
  • 🎉 初始版本上线
COMING SOON
版本历史追踪,即将启航
记录每一次提示词的进化与升级,敬请期待。

💬 用户评价

4.8
⭐⭐⭐⭐⭐
基于 28 条评价
5星
85%
4星
12%
3星
3%
👤
电商运营 - 张先生
⭐⭐⭐⭐⭐ 2025-01-15
双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。
效果好 节省时间
👤
品牌设计师 - 李女士
⭐⭐⭐⭐⭐ 2025-01-10
作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。
创意好 专业
COMING SOON
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...
📋
提示词复制
在当前页面填写参数后直接复制: