首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ffmpeg简单地从视频中删除重复帧

如何使用ffmpeg简单地从视频中删除重复帧
EN

Stack Overflow用户
提问于 2016-12-05 02:46:49
回答 3查看 11.3K关注 0票数 7

首先,我在开场白中说,我不是视频处理方面的专家,尽管多年来我一直在玩弄ffmpeg (以一种相当有限的方式)。因此,我并没有太快与所有的语言,人们经常使用..。以及它如何影响我在我的操作中所做的事情.但无论如何我还是要试试这个..。

我在这里查看了几个链接,例如:ffmpeg - remove sequentially duplicate frames

...but的内容并没有真正帮助我。

我有数百个视频剪辑是在Windows和Linux下使用ffmpeg和其他类似的应用程序创建的。然而,他们在视频中显示“不动”的时间上有一些问题。

举个例子,假设我们有一些网站,可以将一个实时视频流到,比如说,web浏览器中的Flash视频播放器/插件中。在这个例子中,我们讨论的是一个交通摄像头视频流,例如。

有一个运行ffmpeg的实例,它将(Windows)桌面的一个区域捕获到一个视频文件中,即:-

代码语言:javascript
复制
ffmpeg -hide_banner -y -f dshow ^
      -i video="screen-capture-recorder" ^
      -vf "setpts=1.00*PTS,crop=448:336:620:360" ^
      -an -r 25 -vcodec libx264 -crf 0 -qp 0 ^
      -preset ultrafast SAMPLE.flv

假设正在捕获的实际“显示”如下:-

代码语言:javascript
复制
123456789 XXXXX 1234567 XXXXXXXXXXX 123456789 XXXXXXX
^---a---^ ^-P-^ ^--b--^ ^----Q----^ ^---c---^ ^--R--^ 

...where每个字符位置表示(序列)帧。由于互联网连接不好,一个“单帧”可以显示很长时间( 'X‘字符是前一个帧的(几乎)精确副本)。因此,这意味着我们在拍摄的视频片段中,图像一点也不改变(至少是肉眼)。

我们如何处理这些重复的帧?如果“复制”与ffmpeg不同,但在观众看来大致相同,那么我们的方法会如何改变呢?

如果我们简单地删除重复的帧,视频的“步调”就会丢失,而过去可能需要5秒才能显示的东西,现在只需一秒钟,就会产生一个非常不自然的、非常不自然的动作,尽管视频中没有重复的图像。使用“mp_decimate”选项使用ffmpeg似乎是可以实现的,即:-

代码语言:javascript
复制
     ffmpeg -i SAMPLE.flv ^                      ... (i)
        -r 25 ^
        -vf mpdecimate,setpts=N/FRAME_RATE/TB DEC_SAMPLE.mp4

我引用的引用使用了一个命令,该命令显示当它将“mp_decimate”视为“相同”时将移除哪些帧,即:-

代码语言:javascript
复制
     ffmpeg -i SAMPLE.flv ^                      ... (ii)
        -vf mpdecimate ^
        -loglevel debug -f null -

...but知道(复杂的格式化)信息,我们如何重新组织视频而不执行多次运行的ffmpeg提取‘切片’的视频,以便重新组合后?

如果是这样的话,我猜我们得做些如下的事情:-

  • 用户为重复项指定“阈值持续时间”(可能只运行1秒)
  • 确定和保存主要视频信息(fps等-假设帧速率不变)
  • 映射(重复开始的帧/时间)->no。框架/重复的持续时间
  • 如果重复项的持续时间小于用户阈值,则不要将此期间视为“重复帧序列”,然后继续
  • 提取“非重复”视频段(上图中的a,b&c)。
  • 创建带有原始视频规范的“新视频”(空)
  • 对于每个视频段,提取片段的最后一帧与刚刚提取的帧的重复帧一起创建一个简短的视频剪辑(工期=用户规范)。=1秒)将(当前视频segment+short剪辑)追加到“新视频”并重复

...but在我的例子中,很多被捕获的视频可能有30分钟长,并且有数百个10秒长的停顿,所以使用这种方法来“重建”视频需要很长的时间。

这就是为什么我希望有一些“可靠的”和“更智能”的方法使用ffmepg (有/没有'mp_decimate‘过滤器)在几次左右的时间内完成’十进制‘函数.也许有一种方法甚至可以指定所需的段(例如,在文本文件中),并且在ffmpeg运行时,它将停止/重新启动它在指定的时间/帧号上的转码?

除此之外,还有另一个应用程序(在Windows或Linux上使用)可以完成我想要做的事情,而不必手动设置开始/停止点,手动提取/组合视频片段……?

我一直试图在Win7-SP1下使用ffmpeg N-79824-gcaee88d,并在PuppyLinuxSlaacko5.6.4下(一个我目前不记得的不同版本)完成所有这些工作。

谢谢一堆线索。

EN

回答 3

Stack Overflow用户

发布于 2016-12-05 15:34:01

我想你要做的是保持帧的运动和1秒的重复帧,但放弃其余的。

代码语言:javascript
复制
ffmpeg -i in.mp4 -vf
"select='if(gt(scene,0.01),st(1,t),lte(t-ld(1),1))',setpts=N/FRAME_RATE/TB"
trimmed.mp4

select筛选器表达式所做的工作是使用if-然后-else运算符:

gt(scene,0.01)检查当前帧是否检测到相对于前一个帧的运动。该值必须在手动观察的基础上进行校准,通过查看哪个值与帧中的传感器/压缩噪声或视觉噪声相比准确地捕捉实际活动。有关如何获取所有场景更改值的列表,请参见here

如果计算帧有运动,则then子句计算st(1,t)。函数st(val,expr)expr的值存储在编号为val的变量中,它还返回表达式值作为其结果。因此,保留帧的时间戳将继续在该变量中进行更新,直到遇到静态帧为止。

else子句检查当前帧时间戳和存储值的时间戳之间的差异。如果差小于1秒,则保持帧,否则丢弃。

setpts清除所有选定帧的时间戳。

编辑:我用我合成的视频输入测试了我的命令,它成功了。

票数 12
EN

Stack Overflow用户

发布于 2017-01-28 11:16:17

我在这个问题上做了一些工作.发现下面的作品很好..。

似乎输入视频必须有一个“恒定帧速率”才能正常工作,所以第一个命令是:-

代码语言:javascript
复制
ffmpeg -i test.mp4 ^
       -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" ^
       -vsync cfr test01.mp4

然后,我需要查看每一帧的“分数”。该名单是由以下人士编制的:

代码语言:javascript
复制
ffmpeg -i test01.mp4 ^
       -vf select="'gte(scene,0)',metadata=print" -f null - 

我会看看这些分数..。他们的平均(平均)-有点诡计,但这似乎是正常的。在这个例子中,平均分数是'0.021187‘。

然后,我必须选择一个“持久性”值--让“复制”帧运行多长时间。如果你强迫它只保留一帧,整个视频会运行得太快.所以,我用了0.2秒作为起点。

接下来的命令是:-

代码语言:javascript
复制
ffmpeg -i test01.mp4 ^
       -vf "select='if(gt(scene,0.021187),st(1,t),lte(t-ld(1),0.20))', 
                    setpts=N/FRAME_RATE/TB" output.mp4

在那之后,产生的'output.mp4‘视频似乎运行得很好。这仅仅是对“持久力”价值的一点摆弄,在播放得更流畅的视频和突然发生变化的场景之间,可能需要做一些妥协。

我已经整理了一些工作正常的Perl代码,如果人们对它感兴趣,我将研究如何发布.最终(!)

编辑:进行这种“抽取”的另一个优点是,文件的持续时间较短(显然),而且它们的大小也较小。例如,一个运行了00:07:14、大小为22 35的示例视频转到了00:05:35和11 35。

票数 1
EN

Stack Overflow用户

发布于 2016-12-05 05:42:46

可变帧速率编码是完全可能的,但我不认为它能做到你认为的那样。我假设您希望删除这些重复帧以节省空间/带宽?如果是这样的话,它将无法工作,因为编解码器已经在这样做。编解码器使用参考帧,并且只对从引用中更改的内容进行编码。因此,重复的帧几乎没有空间开始。基本上,帧只是被编码成一个数据包,上面写着,复制前一个帧,然后做这个更改。X帧的变化为零,因此只需几个字节即可对每个帧进行编码。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40966394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档