#ffmpeg #ffi #binding #audio-video #audio

rsmpeg

一个尽可能暴露FFmpeg功能的Rust包

21个版本 (破坏性更新)

0.15.1+ffmpeg.7.02024年6月18日
0.14.2+ffmpeg.6.12023年12月30日
0.14.1+ffmpeg.6.02023年3月21日
0.12.0+ffmpeg.5.12022年9月12日
0.1.0 2020年10月31日

#11 in 视频

Download history 318/week @ 2024-05-04 413/week @ 2024-05-11 897/week @ 2024-05-18 984/week @ 2024-05-25 851/week @ 2024-06-01 549/week @ 2024-06-08 1152/week @ 2024-06-15 613/week @ 2024-06-22 565/week @ 2024-06-29 617/week @ 2024-07-06 434/week @ 2024-07-13 549/week @ 2024-07-20 591/week @ 2024-07-27 545/week @ 2024-08-03 899/week @ 2024-08-10 732/week @ 2024-08-17

2,793每月下载量
用于 pizzicato

MIT 协议

200KB
3.5K SLoC

Rsmpeg

Doc Crates.io CI

rsmpeg 是在FFmpeg的Rust绑定之上的一层薄而安全的层,其主要目标是尽可能安全地暴露FFmpeg内部API。

利用Rust的语言设计,您甚至可以比使用FFmpeg的C API更快地构建健壮的多媒体项目。

依赖需求

支持的FFmpeg版本为 6.*7.*

最低支持的Rust版本是 1.70.0(稳定频道)。

入门指南

FFmpeg编译

要使用第一个rsmpeg演示,您需要编译您的FFmpeg

  1. https://github.com/ffmpeg/ffmpeg.
  2. https://trac.ffmpeg.org/wiki/CompilationGuide

如果您觉得编译复杂,有一些有用的编译脚本可供您使用(在 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();
}

在当前文件夹中准备一个简单的图像

test.jpg

运行时设置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)

您也可以在这里放置任何视频或音频文件,这个程序将为您转储媒体信息。

高级用法

  1. FFmpeg链接:请参阅rusty_ffmpeg的文档,了解如何使用环境变量来静态或动态链接FFmpeg。

  2. rsmpeg的高级用法:查看tests文件夹。

贡献者

感谢您的贡献!

依赖项

~1.8–4MB
~87K SLoC