#ffmpeg #video #search #ending #multimedia #opening #needle

bin+lib needle-rs

在视频文件中查找开头和结尾

6 个版本

0.1.5 2022年7月31日
0.1.4 2022年7月25日

#337 in 音频

MIT 或 LGPL-2.1-or-later

90KB
1.5K SLoC

needle

Crates.io docs.rs test release-needle

一个在节目中寻找“针”(开头/简介和结尾/致谢)的工具。

演示

asciicast

快速入门

  1. 为您的平台(如有必要)安装依赖项
  2. 发行页面下载您平台上的最新 needle 二进制文件

Lustre之国的前三集中运行搜索开头和结尾

$ needle search --analyze --no-skip-files ~/Movies/land-of-lustrous-ep1.mkv ~/Movies/land-of-lustrous-ep2.mkv ~/Movies/land-of-lustrous-ep3.mkv

~/Movies/land-of-lustrous-ep2.mkv

* Opening - "00:43s"-"02:12s"
* Ending - "22:10s"-"23:56s"

~/Movies/land-of-lustrous-ep1.mkv

* Opening - N/A
* Ending - "22:10s"-"23:39s"

~/Movies/land-of-lustrous-ep3.mkv

* Opening - "00:40s"-"02:08s"
* Ending - "22:09s"-"23:56s"

运行与上述相同的搜索,但将结果写入与每个视频一起的 JSON(称为“跳过文件”)

$ needle search --analyze --no-display ~/Movies/land-of-lustrous-ep1.mkv ~/Movies/land-of-lustrous-ep2.mkv ~/Movies/land-of-lustrous-ep3.mkv

$ cat ~/Movies/land-of-lustrous-ep1.needle.skip.json
{"ending":[1332.3355712890625,1422.276611328125],"opening":null}

概述

needle 有两个子命令:1) analyze 和 2) search

你可能会注意到,我们上面只使用了 search 子命令。你也可能注意到,输出结果需要相当长的时间。实际上,解码和重采样音频流比搜索开头和结尾花费的时间要长得多。

这就是 analyze 命令的用武之地。使用此子命令,您可以在视频文件旁边预先计算所需数据(就像与跳过文件一样)。预计算的数据以紧凑的二进制格式存储,比音频流小得多。

让我们用上面的相同文件来试试看

$ needle analyze ~/Movies/land-of-lustrous-ep1.mkv ~/Movies/land-of-lustrous-ep2.mkv ~/Movies/land-of-lustrous-ep3.mkv

$ ls -la ~/Movies/land-of-lustrous-*.needle.bin
-rw-r--r--  1 aksiksi  staff  76128 Jul  2 20:09 ~/Movies/land-of-lustrous-ep1.needle.bin
-rw-r--r--  1 aksiksi  staff  76128 Jul  2 20:09 ~/Movies/land-of-lustrous-ep2.needle.bin
-rw-r--r--  1 aksiksi  staff  76128 Jul  2 20:09 ~/Movies/land-of-lustrous-ep3.needle.bin

如你所见,文件相当小:大约76KB,对应大约20分钟的音频。请注意,这个大小可以根据你如何配置分析器而变化。

一旦我们有了这些预计算文件,我们就可以重新运行搜索步骤,但这次我们将省略 --analyze 标志

$ needle search ~/Movies/land-of-lustrous-ep1.mkv ~/Movies/land-of-lustrous-ep2.mkv ~/Movies/land-of-lustrous-ep3.mkv

~/Movies/land-of-lustrous-ep2.mkv

* Opening - "00:43s"-"02:12s"
* Ending - "22:10s"-"23:56s"

~/Movies/land-of-lustrous-ep1.mkv

* Opening - N/A
* Ending - "22:10s"-"23:39s"

~/Movies/land-of-lustrous-ep3.mkv

* Opening - "00:40s"-"02:08s"
* Ending - "22:09s"-"23:56s"

在我的机器(M1 Macbook Pro)上,analyze 步骤需要10秒,而使用预计算数据的 search 步骤不到1秒。

让我们尝试运行 analyzesearch进击的巨人 第四季(是的,你可以指定目录!)

$ time needle analyze "~/Movies/Season 4"
needle analyze "~/Movies/Season 4" 97.08s user 6.29s system 725% cpu 14.242 total

$ time needle search "~/Movies/Season 4"
needle search "~/Movies/Season 4" 112.07s user 16.01s system 810% cpu 15.802 total

啊,现在搜索步骤比分析步骤稍微长一点!原因在于搜索步骤与视频数量呈二次方增长——每对视频都需要单独检查。理想情况下,你应该只针对整个季度的视频运行一次,然后对新添加的视频进行增量搜索,这就是为什么跳过文件很重要的原因。

配置

待办事项

安装

目前有两种方式来安装 needle

  1. 发布页面获取最新二进制文件
  2. cargo安装 needle-rs

依赖项

Linux (Debian/Ubuntu)

下载 FFmpeg 库

sudo apt install \
    libavutil56 \
    libavformat58 \
    libswresample3 \
    libavcodec58

macOS

安装 FFmpeg 和库

brew install ffmpeg

构建

Linux (Debian/Ubuntu)

  1. 安装 cmakeFFmpeg 库和 fftw3(可选,但推荐)
sudo apt install \
    pkg-config \
    cmake \
    libfftw3-dev \
    libavutil-dev \
    libavformat-dev \
    libswresample-dev \
    libavcodec-dev
  1. 构建
cargo install --path .

这将 动态 链接到 FFmpeg 并将 chromaprint 静态链接。

动态

安装库

sudo apt install \
    pkg-config \
    libchromaprint-dev \
    libavutil-dev \
    libavformat-dev \
    libswresample-dev \
    libavcodec-dev

构建

CHROMAPRINT_SYS_DYNAMIC=1 cargo install --path .

macOS

  1. 安装 cmakeFFmpeg
brew install cmake pkg-config ffmpeg
  1. 构建
cargo install --path .

这将 动态 链接到 FFmpeg。 chromaprint 将被静态链接。

Windows

  1. 安装 cargo-vcpkg
cargo install cargo-vcpkg
  1. 安装 vcpkg 依赖项
cargo vcpkg build
  1. 构建
# Statically link against both FFmpeg and chromaprint
cargo build --release --features static

动态

  1. 设置以下环境变量

    a. 动态链接 两个 FFmpeg 和 chromaprint

    # Powershell
    $env:VCPKGRS_DYNAMIC='1'
    $env:VCPKGRS_TRIPLET='x64-windows'
    
    # Git bash
    export VCPKGRS_DYNAMIC=1
    export VCPKGRS_TRIPLET='x64-windows'
    

    b. 仅 chromaprint

    # Powershell
    $env:CHROMAPRINT_SYS_DYNAMIC='1'
    
    # Git bash
    export CHROMAPRINT_SYS_DYNAMIC=1
    
  2. 构建依赖项

cargo vcpkg build
  1. 构建 needle
cargo build --release

许可证

本作品根据 MIT 和 LGPL 2.1(或更新版)双重授权。

如果您选择 静态 链接 FFmpeg,由于 FFmpeg,此许可证为 LGPL 2.1(或更新版)。否则,您可以使用 MIT 许可证。

SPDX-许可证-标识符: MIT LGPL-2.1--更新版

依赖项

~9–21MB
~255K SLoC