#ffmpeg #self-contained #bindings #static #deps #building

bin+lib ffmpeg-dev

FFmpeg 的自包含(无网络/系统依赖)静态 Rust 绑定

22 个版本

0.3.8 2019 年 12 月 16 日
0.3.7 2019 年 12 月 12 日
0.2.7 2019 年 12 月 9 日
0.1.5 2019 年 12 月 9 日

视频 中排名 175

每月下载量 36

MIT 许可证

9MB
1K SLoC

C 686 SLoC // 0.2% comments Rust 457 SLoC // 0.1% comments

关于

直接、清晰且自包含的 FFmpeg (sys) 绑定。

自包含的意思是

  • 不要求或链接任何 FFmpeg 系统依赖。
  • 构建时不需要网络连接。

FFmpeg 绑定现在包括文档注释,包括结构字段! 请参阅 这里

示例

let input_path_cstr = std::ffi::CString::new("path/to/source.mp4").unwrap();

// Open an e.g. MP4 file
avformat_open_input(
    &mut ifmt_ctx,
    input_path_cstr.as_ptr(),
    std::ptr::null_mut(),
    std::ptr::null_mut(),
);
avformat_find_stream_info(ifmt_ctx, std::ptr::null_mut());

// Print info about the loaded file
av_dump_format(
    ifmt_ctx,
    0,
    input_path_cstr.as_ptr(),
    0,
);

对于初学者,std 包含大量方便的 ffi 相关工具。例如,使用 std::slice::from_raw_parts

use ffmpeg_dev::sys::{
    AVMediaType_AVMEDIA_TYPE_VIDEO as AVMEDIA_TYPE_VIDEO,
    AVMediaType_AVMEDIA_TYPE_AUDIO as AVMEDIA_TYPE_AUDIO,
};
let ifmt_ctx: AVFormatContext = *ifmt_ctx;
let nb_streams = (*ifmt_ctx).nb_streams as usize;

// Extract video/audio/etc. streams from our mp4 file.
let streams = std::slice::from_raw_parts((*ifmt_ctx).streams, nb_streams)
    .iter()
    .map(|x| (*x).as_ref().expect("not null"))
    .collect::<Vec<&AVStream>>();

for (index, stream_ptr) in streams.iter().enumerate() {
    let codecpar = *stream_ptr.codecpar;
    if codecpar.codec_type == AVMEDIA_TYPE_AUDIO {
        println!("found audio stream at index {}", index);
    } else if codecpar.codec_type == AVMEDIA_TYPE_VIDEO {
        println!("found video stream at index {}", index);
    }
}

稳定性

API 绑定现在应该是 实际 稳定的。

内部行为

默认情况下,调试或开发构建会不带优化编译 FFmpeg,这是为了加快编译速度。在发布模式下编译或设置 opt-level > 1 将禁用此行为。

许可证警告

我不是律师,此外,我真的很不理解软件许可证。

  • 此代码库是 MIT。
  • 在编译时,此库会构建并静态链接到 LGPL 代码。
    • 这是为了自包含,而不给任何库消费者带来依赖问题。

希望有一天,Rust 生态系统将获得一个不错的 FFmpeg 替代品,例如容器复用/解复用。

未来

尝试将 FFmpeg 编译成 WebAssembly 会很有趣。也许可以作为静态链接的替代方案,如果本地版本不可用,它可以通过网络链接到远程库。

示例

$ cargo run --example h264_video_dec

本写作时添加

  • ./examples/remux.rs
  • ./examples/h264_video_dec.rs

杂项

RLS - 编辑器/IDE 问题

由于某种原因(截至本文撰写之时),RLS在与在target下下载的多个版本的ffmpeg-dev存在冲突。如果我能在我这边进行修复,我将很高兴实现这样的更改。目前,我只是在更新ffmpeg-dev时删除缓存文件夹。

示例或测试内容

  • sintel_trailer-1080p.mp4
  • ./assets/test/test.h264 - 这是来自sintel_trailer-1080p.mp4的视频流的压缩版本。这是一个原始的H264编码视频二进制文件。

Imager构建 - 网站性能工具,用于在网络上高效地分发媒体。

依赖项