仅提取发生变化的帧的一部分
Extract only part of a frame that changed
是否可以使用ffmpeg之类的东西将帧中与最后一帧不同的部分输出为png图像?
您需要进行一些像素差分。使用 For-loop 检查两个位图(帧)的像素更容易,其中 if same color = make transparent in output bitmap
如果不匹配值(颜色)则 show as white in output bitmap
。然后可以将该输出位图编码为输出视频中的 new/next 帧。但是你没有告诉我们你的编程语言,所以没有关于这种方法的进一步建议......
仅使用 FFmpeg,您可以尝试:
ffmpeg -i test1.mp4 -i test2.mp4 -filter_complex "blend=all_mode=difference" -pix_fmt yuv420p -c:v libx264 out_difference.mp4
对于某些人来说,它只提供绿色输出(即使对我来说也是如此),所以如果您找到该问题的解决方案(网络研究),那么这就是您的解决方案。其他混合模式如 "blend=all_mode=screen"
工作正常
既然你说了,你想“只输出帧中与最后一帧不同的部分”,你将需要 tblend 过滤器。
ffmpeg -i in -filter_complex "format=yuva444p,split[diff][out];[diff]tblend=all_expr='if(eq(A,B),0,A)',geq=lum='p(X,Y)':a='if(eq(lum(X,Y)+cb(X,Y)+cr(X,Y),0),0,255)',alphaextract[diff];[out]trim=start_frame=1[out];[out][diff]alphamerge" -vsync vfr out%d.png
限制是如果一个像素最初在 A 和 B 中都是 0
,那么在输出中将是误报。
是否可以使用ffmpeg之类的东西将帧中与最后一帧不同的部分输出为png图像?
您需要进行一些像素差分。使用 For-loop 检查两个位图(帧)的像素更容易,其中 if same color = make transparent in output bitmap
如果不匹配值(颜色)则 show as white in output bitmap
。然后可以将该输出位图编码为输出视频中的 new/next 帧。但是你没有告诉我们你的编程语言,所以没有关于这种方法的进一步建议......
仅使用 FFmpeg,您可以尝试:
ffmpeg -i test1.mp4 -i test2.mp4 -filter_complex "blend=all_mode=difference" -pix_fmt yuv420p -c:v libx264 out_difference.mp4
对于某些人来说,它只提供绿色输出(即使对我来说也是如此),所以如果您找到该问题的解决方案(网络研究),那么这就是您的解决方案。其他混合模式如 "blend=all_mode=screen"
工作正常
既然你说了,你想“只输出帧中与最后一帧不同的部分”,你将需要 tblend 过滤器。
ffmpeg -i in -filter_complex "format=yuva444p,split[diff][out];[diff]tblend=all_expr='if(eq(A,B),0,A)',geq=lum='p(X,Y)':a='if(eq(lum(X,Y)+cb(X,Y)+cr(X,Y),0),0,255)',alphaextract[diff];[out]trim=start_frame=1[out];[out][diff]alphamerge" -vsync vfr out%d.png
限制是如果一个像素最初在 A 和 B 中都是 0
,那么在输出中将是误报。