#frame #ai #model #generate #intermediate #fps

bin+lib more-fps

more-fps: 使用可以生成中间帧的AI模型,我们可以使我们的视频更平滑

5个版本

0.1.4 2023年5月28日
0.1.3 2023年5月28日
0.1.2 2023年5月28日
0.1.1 2023年5月27日
0.1.0 2023年5月27日

152 in 视频

Download history 1/week @ 2024-03-15 27/week @ 2024-03-29 6/week @ 2024-04-05

每月55次下载

MIT 协议

41KB
850

更多FPS

使用可以生成中间帧的AI模型,我们可以使我们的视频更平滑。

本项目旨在自动化此过程。

✔️ 要求 ✔️

⚠️ 您需要将ffmpeg和ffprobe添加到PATH。Windows用户,您可能需要手动添加它们到PATH

安装

安装 rust

cargo install more-fps

用法

首先我们需要设置一些环境变量(使用正确的路径)

  • AI_MODEL
    • 模型文件夹的路径
  • AI_BINARY
    • AI二进制文件的路径(它是一个文件!)

例如,假设AI模型和二进制文件在您的当前目录中

Linux

export AI_MODEL=models/rife-v4.6
export AI_BINARY=rife-ncnn-vulkan
RUST_LOG=info more-fps -t /tmp/more_fps/ input.mkv output.mkv

Windows

命令提示符

set AI_MODEL=models/rife-v4.6
set AI_BINARY=rife-ncnn-vulkan

TODO:完整的Windows命令


Usage: more-fps [OPTIONS] -t <TEMP_DIR> <INPUT> <OUTPUT> <AI_BINARY> <AI_MODEL>

Arguments:
  <INPUT>
          Path to the file for which we'll increase the frame rate

  <OUTPUT>
          final output path if it exists, we'll try to build on-top of it

  <AI_BINARY>
          AI Model used to generate intermediate frames
          
          [env: AI_BINARY=]

  <AI_MODEL>
          [env: AI_MODEL=]

Options:
      --fps <FPS>
          The target frame count for the ai binary The default will have the ai binary change your (most likely 24fps) video to 60fps
          
          [default: sixty]

          Possible values:
          - sixty: 60 fps

  -t <TEMP_DIR>
          Path to put temporary/intermediate data like ffmpeg generated frames and ai generated frames If the path doesn't exist, it will be created Perferably a fast m.2 ssd or ramdisk because they are fast

  -m <MAX_STEP_SIZE>
          Maximum number of seconds to extract (assuming the scene splits are too big)
          
          [default: 50]

      --ai-args <AI_ARGS>
          Extra args you may want to pass to the ai binary
          
          [default: "-g 0,-1 -j 8:8,16:32:16"]

  -r <RESET>
          Clears cached data
          
          [default: everything]

          Possible values:
          - everything: Delete the entire temp_directory which contains a few building blocks: "ffmpeg" - used for storing extracted frames "generated_frames" - used for storing generated frames "scene_data.txt" - holds scene timestamps
          - nothing:    Nothing will be deleted... meaning we try to continue from where we left off

  -s <SCENE_GT>
          Defines how we should split the video up before generating frames If there is a big difference between frames, the ai will generate bad frames
          
          [default: .1]

      --crf <CRF>
          https://trac.ffmpeg.org/wiki/Encode/H.264#a1.ChooseaCRFvalue
          
          [default: 18]

  -h, --help
          Print help (see a summary with '-h')

🧠 高级技巧 🧠

  • 将临时目录的目标设置为RAM磁盘。这将显著加快进程,因为我们进行了大量的写入。
  • 如果您想从上次停止的地方继续,将重置选项(-r)设置为nothing。使用此选项设置为nothing时,我们将简单地从上次停止的地方继续提取。

💡 工作原理 💡

  1. 识别视频的场景变化
  2. 提取帧
  3. 生成与目标FPS匹配的帧(默认:60)
  4. 将生成的帧聚合到一个新的视频中
  5. 包含来自原始视频的音频和字幕

识别场景变化

如果两个连续的帧差异足够大,模型可能会生成一个非常差的中间帧。为了避免这种情况,我们使用ffmpeg来识别具有足够场景差异的时间戳。您可以使用 -s 选项更改此场景值(见上面的帮助文本)

https://www.ffmpeg.org/ffmpeg-filters.html#select_002c-aselect

然后我们将这些时间戳用作提取帧的起始/结束时间。

⚠️ 如果您注意到这些差的帧,我建议使用 -s 选项降低场景切割阈值。

提取帧

我们希望从原始视频文件中提取帧,但出于两个原因,我们不希望一次性提取所有帧:

  1. 如上所述,AI模型可能会生成不良的中间帧。
  2. 提取所有帧可能需要数百GB的数据,这可能会超出您磁盘的容量。

因此,我们不是提取所有帧,而是根据时间戳给出的间隔提取。

这些时间间隔可能仍然非常大... 为了避免超出磁盘容量,我设置了一个默认的 MAX_STEP_SIZE。此选项用于限制每次帧提取将使用多少秒。

生成与目标FPS匹配的帧

这是使用AI模型的地方。我们需要一个支持上述 "-n" 选项的模型,这样我们就可以告诉模型每次帧提取应生成多少帧。

最简单的例子是,如果我们有1秒(通常是23.998即24 fps),AI模型将被指示生成60帧。并非所有场景切割都这么理想,因此会涉及小数...

⚠️ 我假设您有一个CPU和GPU想要使用... 如果不是这种情况,请随意更改 --ai-args 选项

聚合生成的帧

现在我们有了AI生成的帧,我们使用ffmpeg生成视频。

包含来自原始视频的音频和字幕

在提取帧完成后,我们将音频+字幕从原始文件复制到输出文件。


其他

如果您想支持我,您可以发送任何金额的Monero

42NTT1Q91P2TcG7vzN3oi2cYEJEaJ6QbzH3pwXGDKiSQiaBVAeZkYnBX6SijCxgKpc5tTUeVW5AuwDWBNdewZia9AJ5TgLT

TODO

  • 添加测试管道
  • cli应包括预设设置,以便我们可以针对超快/非常慢
  • 支持更高的FPS,如75、90、120、144、165、180、240等
  • 支持Windows
  • 使用场景文本文件来确定提取的间隔
    • 检查每个视频文件的时间范围,以确保其足够长。在错误的时间取消程序可能会创建更短的视频(BUG)

依赖关系

~5–7MB
~124K SLoC