Cross platform FFI bindings for FFmpeg inner libraries

Linking FFmpeg libraries for you

Rusty FFmpeg

Cross platform FFI bindings for FFmpeg inner libraries. This is a crate that:

  1. Linking FFmpeg libraries for you.
  2. Generates Rust binding for FFmpeg libraries.

Getting started:

To use this crate, you need to set several environment variables.

The simplest usage:

*nix

Build ffmpeg statically and set FFMPEG_PKG_CONFIG_PATH to the path of the generated FFmpeg pkg-config files. And you don't need to set other environment variables for static linking.

(Hint: set FFMPEG_PKG_CONFIG_PATH to some placeholder value will let rusty_ffmpeg probing system library.)

Windows

rusty_ffmpeg can link FFmpeg using vcpkg. Install vcpkg, check documentation of the vcpkg crate for the environment variables to set, then it works.

Fine-grained usage:

You need to set several environment variables for both linking and binding generating procedure.

To link:

  1. Dynamic linking with pre-built dylib: Set FFMPEG_DLL_PATH to the path of dll or so. (Windows: Put corresponding .lib file next to the .dll file.)

  2. Static linking with pre-built staticlib: Set FFMPEG_LIB_DIR to the path of the FFmpeg pre-built libs directory.

To generate bindings:

  1. Compile-time binding generation(requires the Clang dylib): Set FFMPEG_INCLUDE_DIR to the path to the header files for binding generation.

  2. Use your pre-built binding: Set FFMPEG_BINDING_PATH to the pre-built binding file. The pre-built binding is usually copied from the OUT_DIR of the compile-time binding generation, by using it you don't need to regenerate the same binding file again and again.

Attention

FFI is not that easy, especially when you are dealing with a big old C project. Don't feel depressed when there are some problems. The CI check already have some typical ffmpeg compilation and use cases for you to check. File an issue if you still have any problem.

Issues

Collection of the latest Issues

ldm0

ldm0

enhancement
1

Current we got enum like this:

Which is not good to use. And the rust-bindgen provides us several options: https://docs.rs/bindgen/0.55.1/bindgen/struct.Builder.html

However they all not suitable for out situation. I want the generated enum can be directly used(rustified_enum creates const in impl, which cannot be used just like the bitflags crate does), and is able to do calculation(which makes newtype_enum not suitable, it construct a new_type containing a integer), and extendable(some consts cnanot be directly generated with bindgen, which need to be add by hand, but generate const value in a specific module makes adding them not possible), The bitfield_enum is better but each enum only occupies a bit, which makes the maximum number of each enum is limited.

The last option is trimming the prefix of each enum, which is suitable since FFmpeg's enum name never overlaps. So it's blocked on https://github.com/rust-lang/rust-bindgen/issues/777

Information - Updated May 13, 2022

Stars: 39
Forks: 5
Issues: 3

This is an example of a Rust server that functions as a remote schema for...

Rust + Hasura Rust server that functions as a Hasura

This is an example of a Rust server that functions as a remote schema for...

Newport Engine is a modular 2D and 3D game engine built in Rust for Rust

It is designed to be easily extendable and easy to use

Newport Engine is a modular 2D and 3D game engine built in Rust for Rust

Newport Engine is a modular 2D and 3D game engine built in Rust for Rust

It is designed to be easily extendable and easy to use

Newport Engine is a modular 2D and 3D game engine built in Rust for Rust

liboqs-rust: Rust bindings for liboqs

Qyantum Safe liboqs rust bindings

liboqs-rust: Rust bindings for liboqs

msgflo-rust: Rust participant support for MsgFlo

Flowhub visual programming IDE

msgflo-rust: Rust participant support for MsgFlo

Trojan-rust is a rust implementation for Trojan protocol that is targeted to circumvent GFW

Trojan protocol that is targeted to circumvent tokio-rs to achieve high performance async io

Trojan-rust is a rust implementation for Trojan protocol that is targeted to circumvent GFW
Actix

1.0K

How to be a full stack Rust Developer

Read Rust the Rust blog posts at Steadylearner

How to be a full stack Rust Developer

Rust library translation (rust-src/rust-std/stdlib/rustlib translation)

This is the place to translate Having a documentation in your native language is essential if you don't speak English, and still enjoyable even if...

Rust library translation (rust-src/rust-std/stdlib/rustlib translation)

False Positive for rust-lang/rust#83583

The deprecation lint proc_macro_derive_resolution_fallback is intended to catch proc macro generated code that refers to items from parent modules that should not be in scope:

False Positive for rust-lang/rust#83583

A CHIP-8 & SuperChip interpreter written in Rust using rust-sdl2

If you're getting compile errors it may be because

A CHIP-8 & SuperChip interpreter written in Rust using rust-sdl2

Rust-Svelte-on-Rust

Starter template for Rocket backend server

Rust-Svelte-on-Rust
Facebook Instagram Twitter GitHub Dribbble
Privacy