ffmpeg:是否可以替换可变帧率视频中的帧?

2024-03-10

用于视频处理的机器学习算法通常适用于帧(图像)而不是视频。

在我的工作中,我使用 ffmpeg 将特定场景转储为一系列 .png 文件,以某种方式处理它们(去噪、去模糊、着色、注释、修复等),将结果输出到相同数量的 .png 文件中,然后用新帧更新原始视频。

这对于恒定帧速率 (CFR) 视频效果很好。我转储图像as so https://stackoverflow.com/a/40090033/1670156(例如,从 1:47 开始的 50 帧序列):

ffmpeg -i input.mp4 -vf "select='gte(t,107)*lt(selected_n,50)'" -vsync passthrough '107+%06d.png'

然后编辑图像后,我替换原始图像as so https://stackoverflow.com/a/50257384/1670156(对于 12.5fps CFR 视频):

ffmpeg -i input.mp4 -itsoffset 107 -framerate 25/2 -i '107+%06d.png' -filter_complex "[0]overlay=eof_action=pass" -vsync passthrough -c:a copy output.mp4

然而,我处理的许多视频都是可变帧率 (VFR),这带来了一些挑战。

一个简单的解决方案是将 VFR 视频转换为 CFR,无论如何 ffmpeg 都想这样做,但我想知道是否可以避免这种情况。原因是 CFR 需要要么丢帧——因为 ML 视频处理的目的通常是为了提高输出,我想避免这种情况——要么重复帧——但我现在正在使用的升级算法使用数据的前一帧和下一帧 - 如果前一帧或下一帧是重复的,则...没有用于升级的数据。

With -vsync passthrough,我本来希望我可以简单地删除-framerate选项,并按原样保留原始帧,但生成的命令:

ffmpeg -i input.mp4 -itsoffset 107 -i '107+%06d.png' -filter_complex "[0]overlay=eof_action=pass" -vsync passthrough -c:a copy output.mp4

使用 ffmpeg 的默认25fps https://video.stackexchange.com/a/13074,并且丢掉很多帧。有没有可靠的方法来替换 VFR 视频中的帧?


是的,可以做到,但是很复杂。为了使该过程可靠地工作,覆盖视频与底层视频具有完全相同的帧时间戳至关重要。生成此类 VFR 视频片段叠加需要从源视频捕获帧时间戳,以生成精确定时的替换片段。

该过程的简短版本是将上述命令替换为以下命令来提取图像:

ffmpeg -i input.mp4 -vf "select='gte(t,107)*lt(selected_n,50)',showinfo" -vsync passthrough '107+%06d.png' 2>&1 | 'sed s/\r/\n/g' | showinfo2concat.py --prefix="107+" >concat.txt

这需要一个可以下载的脚本here https://github.com/arnon-weinberg/Upscale-interpolate-STARnet/raw/master/showinfo2concat.py。编辑图像后,使用以下内容更新源视频:

ffmpeg -i input.mp4 -f concat -safe 0 -i concat.txt -filter_complex"[1]settb=1/90000,setpts=9644455+PTS*25/90000[o];[0:v:0][o]overlay=eof_action=pass" -vsync passthrough -r 90000 output.mp4

其中 90000 是时间尺度 https://stackoverflow.com/a/43337235/1670156(时基的倒数),9644455 是要替换的第一帧的 PTS。

See the source https://technology.research-lab.ca/2022/05/using-ffmpeg-to-replace-video-frames/有关这些命令实际用途的更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ffmpeg:是否可以替换可变帧率视频中的帧? 的相关文章

  • swscaler@0dd9e620:已弃用的像素格式,请确保您正确设置了范围”

    我正在使用 FFMpeg 解码 RTSP 视频流 在显示时间 调用cv imshow 我得到以下异常 swscaler 0d55e5c0 已弃用像素格式 请确保您这样做了 正确设置范围 我正在将像素格式从 AV PIX FMT YUVJ42
  • 如何在PHP中显示上传文件后的结果

    我有一个将视频上传到服务器的脚本 一切正常 但在视频上传到服务器完成后出现问题 它以数组形式显示 uploads 文件夹中所有上传的文件 我只想要我刚刚上传的文件的结果 它不显示以前的文件 我需要 ffmpeg 来提高视频质量 索引 php
  • FFmpeg 转换错误

    我正在尝试使用 FFmpeg 将视频转换为 webm 格式 我已经安装了此处列出的所有依赖项 http www videochat scripts com install ffmpeg mplayer flvtool2 yamdi x264
  • RTSP 帧抓取会产生拖尾、像素化和损坏的图像

    我正在尝试使用以下命令从 RTSP 流中每秒捕获一帧 ffmpeg i rtsp XXX q v 1 vf fps fps 1 strftime 1 ZZZZ H M S jpg But some of the frames are sme
  • Python 子进程中的 ffmpeg - 无法找到“管道:”的合适输出格式

    尝试通过 Python 使用 ffmpeg 将字幕刻录到视频中 在命令行中工作正常 但是当从 Python 子进程调用时 p subprocess Popen cd Downloads yt ffmpeg i video vf subtit
  • 来自 http 直播 m3u8 文件的 FFMPEG mp4? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何从 http 直播 m3u8 文件中提取 mp4 我尝试了下面这个命令 ffmpeg i input file f rawvideo
  • OpenCV 3.0.0 使用 FFMPEG 时出错

    我使用 OpenCV 一段时间了 但是 我最近将系统更改为没有任何管理员权限的集群 问题是这样的 在我的主文件夹中 我安装了 FFMPEG ffmpeg 网站上提供的最新稳定版本 我将它安装在 HOME 中 因此在 HOME lib 中安装
  • 使用 ffmpeg 进行视频标准化

    无论如何 有没有使用 ffmpeg 脚本将视频亮度标准化为其完整的动态范围 我一直在尝试用 lutyuv 这样做 ffmpeg i input mp4 vf lutyuv y val minval 255 maxval minval 输出
  • pictureBox 图片处理异常

    我最近想尝试一下锻造网 http www aforgenet com framework 因为我发现它非常简单 所以我决定使用 Video FFMPEG 命名空间进行一些简单的视频播放 这样我就可以将每个帧直接放在 pictureBox 上
  • 为视频添加水印的命令

    我尝试在一个视频上添加水印 但 FFmpeg 命令不会执行 错误代码为 3037 我运行相同的代码来修剪视频 视频已成功修剪 因此没有问题inputpath or outputpath我也有ic watermark png在资产文件夹中 我
  • 在 R 中导入 png 文件并转换为动画(.mp4)

    我正在尝试用 R 中的几个 png 文件创建一个简短的动画 我尝试了 packagemagick但只有当我将它们保存为 gif 时它才有效 当我尝试另存为 mp4 时 它将生成一个 mp4 文件 但一旦打开它 只会显示第一张图像 我的代码是
  • 如何使用ffmpeg从avi生成gif? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试使用以下命令将视频的一部分提取到动画 gif 中 ffmpeg i video avi t 5 out gif 它会生成一个 g
  • 使用 ffmpeg 从 unix 命令批量将 wav 文件转换为 16 位

    我有一个由许多子文件夹组成的文件夹 每个子文件夹都有其他子文件夹 其中包含 wav 文件 我想像这样转换所有文件 ffmpeg i BmBmGG BmBmBmBm wav acodec pcm s16le ar 44100 BmBmGG B
  • 使用 libx264 为 Raspberry pi 编译 Xuggler 时的问题 #2

    我正在尝试编译Xuggler http www xuggle com xuggler 对于 Raspberry Pi 在 Debian 操作系统上运行 又名 Raspbian 我遵循了可用的 基本构建说明 here http www xug
  • 如何使用 ffmpeg 提取时间精确的视频片段?

    这并不是一个特别新的问题领域 但我已经尝试过那里建议的内容 但运气不佳 那么 我的故事 我有一大段 15 秒的直接来自camera mov 视频 我想从中提取特定的块 我可以通过开始时间和停止时间 以秒为单位 来识别该块 我首先尝试执行我称
  • C# - 捕获 RTP 流并发送到语音识别

    我正在努力实现的目标 在 C 中捕获 RTP 流 将该流转发到 System Speech SpeechRecognitionEngine 我正在创建一个基于 Linux 的机器人 它将接受麦克风输入 将其发送给 Windows 机器 Wi
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • FFmpeg - 来自 NodeJS 的 RTMP 流,流比实时更快

    我的目标是在 Node 中渲染画布 并将该画布流式传输到 RTMP 服务器 最终是 Twitch 但现在我正在在本地 RTMP 服务器上测试 流式传输到 RTMP 的标准方式似乎是ffmpeg 所以我使用它 从 NodeJS 中作为子进程生

随机推荐