首页 > 其他分享 >ffmpeg提取最后一个关键帧

ffmpeg提取最后一个关键帧

时间:2023-02-20 14:01:35浏览次数:36  
标签:关键帧 提取 ffmpeg pict type TB

例子:某文件夹中全部是mp4视频,对每个视频提取最后一个关键帧,并保存为同名jpg,一行代码实现

方法1:

for i in /path/to/folder/*.mp4; do ffmpeg -i "$i" -vf "select='eq(pict_type,I)'" -skip_frame nokey -frame_pts 1 -f image2 -vframes 1 "${i%.*}.jpg"; done

说明:采用for do done的方式,比较好理解,其中ffmpeg中命令的意思是:找到视频中的关键帧,-vf "select='eq(pict_type,I)'" 选项指定了只选择关键帧,-skip_frame nokey 选项指定跳过非关键帧,-frame_pts 1 选项指定根据时间戳获取最后一个关键帧,-f image2 选项指定输出图像格式为 JPEG,-vframes 1 选项指定仅提取一帧,"${i%.*}.jpg" 则指定输出文件名为输入文件名去掉扩展名后加上 .jpg

方法2:

for i in /path/to/folder/*.mp4; do ffmpeg -i "$i"  -vf "select='eq(pict_type,I)',showinfo" -f null - 2>&1 | grep "pict_type:I" | tail -n 1 | sed "s/.*pos:\([0-9]\+\).*/\1/" | xargs -I{} ffmpeg -i "$i" -vf "select='eq(pict_type,I)',setpts=N/TB" -ss {} -vframes 1  "${i%.*}.jpg" ; done

说明:这个方法是找到关键帧,然后提取每个帧的起始时间,然后取最后一个帧的时间,然后提取

setpts 是 FFmpeg 中用于设置视频帧时间戳的滤镜。在命令中使用 setpts=N/TB 参数,其中 N 表示帧时间戳(PTS)的新值,TB 表示时间基准(timebase),即单位时间所包含的时间长度。这里的 N/TB 就是新的时间戳的值,其单位是秒。

使用 setpts=N/TB 参数可以改变视频帧的播放速度,因为它可以改变视频帧的时间戳,从而影响视频帧的播放顺序和速度。

对于本题中的命令,使用 setpts=N/TB 参数可以让 FFmpeg 从视频中提取关键帧并设置时间戳,将时间戳设置为关键帧出现的时间点,保证提取的关键帧是视频中真实存在的帧,而不是重新编码后的帧。这样,在提取关键帧的同时,可以保证提取出来的帧不会因为时间戳的问题出现问题。

方法3:

ls /path/to/folder/*.mp4 | xargs -I{} sh -c 'ffmpeg -i "{}" -vf "select=eq(pict_type\,I),setpts=N/TB" -ss $(ffmpeg -i "{}" -vf "select=eq(pict_type\,I),showinfo" -f null - 2>&1 | grep "pict_type:I" | tail -n 1 | sed "s/.*pos:\([0-9]\+\).*/\1/") -vframes 1 "${1%.*}.jpg"' sh {} \;

说明:该方法采用ls的方式,所以xargs中需要采用sh -c 

标签:关键帧,提取,ffmpeg,pict,type,TB
From: https://www.cnblogs.com/chentiao/p/17137115.html

相关文章

  • FFmpeg的split滤镜介绍
    本文介绍split滤镜的用法以及 ​​avfilter_link​​ 函数的具体用法。本文的代码下载地址:​​GitHub​​,编译环境是Qt5.15.2跟MSVC2019_64bit。上下文这个词读......
  • FFmpeg滤镜API
    FFmpeg采用了FilterGraph的模型来管理整个数据流的处理,参与数据处理的各个功能模块叫做Filter(滤镜)。普通的用户在使用音视频剪辑软件的时候,会把滤镜这个词理解为app......
  • FFmpeg的scale滤镜介绍
    FFmpeg的滤镜API其实有3种调用方法,我个人觉得他是3种用法,如下:1,用 ​​avfilter_graph_create_filter​​ 一个一个地创建滤镜(​​AVFilterContext​​),然后用 ​​......
  • FFmpeg:搭建rstp/rtmp/HLS服务器(测试推流)
    在日常开发中,有些时候需要做一些推拉流测试,但又找不到可以测试的拉流地址,这个时候,可以使用rtsp-simple-server来搭建rtsp/rtmp/HLS服务器。1.服务器搭建rstp-simple-ser......
  • centos-提取rpm里面内容
    概述有的时候想提取lib-rpm的so文件文件,又不想安装rpm则可以提取rpm包envcentos6.801、requirementyuminstall-yrpmcpio命令相关的rpm02、提取rpm里面的内......
  • captura怎样解决FFmpeg解析错误问题
     captura怎样解决FFmpeg解析错误问题?captura软件里大家在进行屏幕录制的工作得时候都会用到captura软件,软件得功能可以满足大家的需求,可以轻松的录制屏幕,进行屏幕截屏等......
  • 【和ChatGPT对话】帮助新手批量提取图片文字信息到文件
    前言和小结今天的另外一个案例是模拟有一定编程基础(新新手)的电脑工作者,让ChatGPT处理一些图片数据,需求复杂一些。具体任务是帮助识别学生缴费图片的信息,便于复核。然后......
  • H.264:FFMpeg 实现简单的播放器
    FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手。我刚接触FFMPEG的时候也感觉不知从何学起。因此我把自己做项目过程中实现的一个非......
  • 使用JS从HTML中提取文本
    functionextractContent(html){returnnewDOMParser().parseFromString(html,"text/html").documentElement.textContent;}示例letresult......
  • jmeter正则表达式提取器
    正则表达式提取器:允许用户从服务器的响应中通过使用perl的正则表达式提取值。该元素会作用在指定范围取样器,用正则表达式提取所需值,生成模板字符串,并将结果存储到给定的......