6 个版本
0.1.5 | 2022年7月31日 |
---|---|
0.1.4 | 2022年7月25日 |
#337 in 音频
90KB
1.5K SLoC
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秒。
让我们尝试运行 analyze 和 search 对 进击的巨人 第四季(是的,你可以指定目录!)
$ 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
依赖项
Linux (Debian/Ubuntu)
下载 FFmpeg 库
sudo apt install \
libavutil56 \
libavformat58 \
libswresample3 \
libavcodec58
macOS
安装 FFmpeg 和库
brew install ffmpeg
构建
Linux (Debian/Ubuntu)
- 安装
cmake
、FFmpeg
库和fftw3
(可选,但推荐)
sudo apt install \
pkg-config \
cmake \
libfftw3-dev \
libavutil-dev \
libavformat-dev \
libswresample-dev \
libavcodec-dev
- 构建
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
- 安装
cmake
和FFmpeg
brew install cmake pkg-config ffmpeg
- 构建
cargo install --path .
这将 动态 链接到 FFmpeg。 chromaprint
将被静态链接。
Windows
- 安装
cargo-vcpkg
cargo install cargo-vcpkg
- 安装
vcpkg
依赖项
cargo vcpkg build
- 构建
# Statically link against both FFmpeg and chromaprint
cargo build --release --features static
动态
-
设置以下环境变量
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
-
构建依赖项
cargo vcpkg build
- 构建
needle
cargo build --release
许可证
本作品根据 MIT 和 LGPL 2.1(或更新版)双重授权。
如果您选择 静态 链接 FFmpeg,由于 FFmpeg,此许可证为 LGPL 2.1(或更新版)。否则,您可以使用 MIT 许可证。
SPDX-许可证-标识符: MIT 或 LGPL-2.1-或-更新版
依赖项
~9–21MB
~255K SLoC