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
9MB
1K SLoC
关于
直接、清晰且自包含的 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
时删除缓存文件夹。
相关链接
- FFmpeg文档概述
- FFmpeg C API文档
- FFmpeg C示例(根据我的经验,转换成Rust非常简单)
- Rust文档
示例或测试内容
- sintel_trailer-1080p.mp4
./assets/test/test.h264
- 这是来自sintel_trailer-1080p.mp4
的视频流的压缩版本。这是一个原始的H264编码视频二进制文件。
为Imager构建 - 网站性能工具,用于在网络上高效地分发媒体。