21个版本 (破坏性更新)
0.15.1+ffmpeg.7.0 | 2024年6月18日 |
---|---|
0.14.2+ffmpeg.6.1 | 2023年12月30日 |
0.14.1+ffmpeg.6.0 | 2023年3月21日 |
0.12.0+ffmpeg.5.1 | 2022年9月12日 |
0.1.0 | 2020年10月31日 |
#11 in 视频
2,793每月下载量
用于 pizzicato
200KB
3.5K SLoC
Rsmpeg
rsmpeg
是在FFmpeg的Rust绑定之上的一层薄而安全的层,其主要目标是尽可能安全地暴露FFmpeg内部API。
利用Rust的语言设计,您甚至可以比使用FFmpeg的C API更快地构建健壮的多媒体项目。
依赖需求
支持的FFmpeg版本为 6.*
,7.*
。
最低支持的Rust版本是 1.70.0
(稳定频道)。
入门指南
FFmpeg编译
要使用第一个rsmpeg演示,您需要编译您的FFmpeg
如果您觉得编译复杂,有一些有用的编译脚本可供您使用(在 utils
文件夹中)。
要使用一些常见参数构建FFmpeg:(不要忘记安装构建依赖项)
# macOS
zsh utils/mac_ffmpeg.rs
# Linux
bash utils/linux_ffmpeg.rs
# Windows
# You need a Linux machine for cross compiling, then copy the artifact to your
# Windows machine.
bash utils/windows_ffmpeg.rs
这些脚本默认构建最新稳定的FFmpeg。您可以显式构建特定的FFmpeg版本。
# macOS & FFmpeg 7.0
zsh utils/mac_ffmpeg.rs release/7.0
通过cargo-vcpkg编译FFmpeg
使用 vcpkg 来管理FFmpeg依赖项可能更容易,因为所有配置都包含在您的 Cargo.toml
中。这对于将项目作为下载的用户来说特别方便,他们可以通过运行单个命令来构建所有必要的依赖项。注意,使用此方法构建FFmpeg可能需要很长时间,尽管第一次生成的库文件可能被缓存。
首先,安装 cargo-vcpkg 工具
cargo install cargo-vcpkg
添加vcpkg依赖项
[package.metadata.vcpkg]
dependencies = ["ffmpeg"]
git = "https://github.com/microsoft/vcpkg"
rev = "4a600e9" // Although it is possible to link to the master branch of vcpkg, it may be better to fix a specific revision in order to avoid unwanted breaking changes.
您可能希望根据您需要的FFmpeg模块指定功能子集。例如,如果您的代码使用x264和VPX编解码器,则依赖项应如下所示
dependencies = ["ffmpeg[x264,vpx]"]
在某些情况下,您可能需要指定三元组和/或附加依赖项。例如,在Windows上,上述部分将类似于以下内容
[package.metadata.vcpkg]
dependencies = ["ffmpeg[x264,vpx]:x64-windows-static-md"]
git = "https://github.com/microsoft/vcpkg"
rev = "4a600e9"
功能可能因您的应用程序而异,在我们的案例中,为了构建演示,我们需要x264。
设置环境
# *nix (the path of the folder named after the triplet may change)
export FFMPEG_PKG_CONFIG_PATH=${PWD}/target/vcpkg/installed/x64-linux/lib/pkgconfig
# Windows(CMD)
set FFMPEG_PKG_CONFIG_PATH=%CD%\target\vcpkg\installed\x64-windows-static-md\lib\pkgconfig
# Windows(PowerShell)
$env:FFMPEG_PKG_CONFIG_PATH="$(($PWD).path)\target\vcpkg\installed\x64-windows-static-md\lib\pkgconfig"
运行vcpkg构建
cargo vcpkg --verbose build
--verbose
选项不是必需的,但在构建失败时可能有助于识别任何错误。
完成这些步骤后,您就可以构建和运行您的项目了。下一节中演示的代码的完整工作示例可在以下位置找到:https://github.com/aegroto/rsmpeg-vcpkg-demo。
Rsmpeg演示
请确保您已编译了FFmpeg。
首先将rsmpeg
添加到您的Cargo.toml
文件中
[dependencies]
# Add this if you are using ffmpeg 6.*
rsmpeg = { version = "0.15.0", default-features = false, features = ["ffmpeg6"] }
# Add this if you are using ffmpeg 7.* (feature `ffmpeg7` is enabled by default)
rsmpeg = "0.15.0"
编写您简单的媒体文件信息转储器
use std::ffi::{CStr, CString};
use std::error::Error;
use rsmpeg::avformat::AVFormatContextInput;
fn dump_av_info(path: &CStr) -> Result<(), Box<dyn Error>> {
let mut input_format_context = AVFormatContextInput::open(path, None, &mut None)?;
input_format_context.dump(0, path)?;
Ok(())
}
fn main() {
dump_av_info(&CString::new("./test.jpg").unwrap()).unwrap();
}
在当前文件夹中准备一个简单的图像
运行时设置FFMPEG_PKG_CONFIG_PATH
为您的工件文件夹(绝对路径!)中的pkgconfig文件路径(xxx/ffmpeg_build/lib/pkgconfig
)。
# macOS & Linux
export FFMPEG_PKG_CONFIG_PATH=xxx/ffmpeg_build/lib/pkgconfig
# Windows
set FFMPEG_PKG_CONFIG_PATH=xxx/ffmpeg_build/lib/pkgconfig
cargo run
然后它就可以工作了
Input #0, image2, from './test.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 1390 kb/s
Stream #0:0: Video: mjpeg, none, 25 fps, 25 tbr, 25 tbn, 25 tbc
(单张图像的持续时间低于25fps为0.04s)
您也可以在这里放置任何视频或音频文件,这个程序将为您转储媒体信息。
高级用法
-
FFmpeg链接:请参阅
rusty_ffmpeg
的文档,了解如何使用环境变量来静态或动态链接FFmpeg。 -
rsmpeg的高级用法:查看
tests
文件夹。
贡献者
感谢您的贡献!
依赖项
~1.8–4MB
~87K SLoC