3个不稳定版本
0.5.1 | 2023年10月31日 |
---|---|
0.5.0 | 2023年10月22日 |
0.4.0 | 2023年10月17日 |
#14 在 #sanitizer
3,501 每月下载量
用于 mp4san
16KB
194 行
mp4san —
Rust MP4格式“消毒剂”。
当前消毒剂能够
- 将输入中存在的所有展示元数据作为一个自包含的连续字节数组返回。
- 找到并返回包含(连续)媒体数据的输入中span的指针。
"展示"元数据意味着任何MP4播放器播放文件所需的元数据。"自包含和连续"意味着返回的元数据可以与媒体数据连接在一起形成有效的MP4文件。
不支持MP4功能
消毒剂目前不支持
- "分段"MP4文件,这通常用于自适应比特率流。
- 不连续的媒体数据,即媒体数据(
mdat
)盒子与展示元数据(moov
)交织。 - 指向单独文件的媒体数据引用(
dref
)。 - 任何类似的格式,例如Quicktime文件格式(
mov
)或旧的MP4版本1,其文件类型头(ftyp
)中不包含isom
兼容的品牌。
用法
消毒剂的主要入口点是sanitize
/sanitize_async
,它们接受一个Read
+ Skip
输入。该Skip
特质代表Seek
特质的子集;一个可以向前跳过的输入流,但不一定可以定位到任意位置。
use mp4san_test::{example_ftyp, example_mdat, example_moov};
let example_input = [example_ftyp(), example_mdat(), example_moov()].concat();
let sanitized = mp4san::sanitize(std::io::Cursor::new(example_input)).unwrap();
assert_eq!(sanitized.metadata, Some([example_ftyp(), example_moov()].concat()));
assert_eq!(sanitized.data.offset, example_ftyp().len() as u64);
assert_eq!(sanitized.data.len, example_mdat().len() as u64);
parse
模块还包含一个不太稳定且未记录的API,可以用于解析单个MP4盒子类型。
提交错误报告
GitHub 是项目的缺陷跟踪器。请在 搜索 相似的现有问题后再 提交新的问题。
测试
使用功能 mp4san-test/ffmpeg
和 mp4san-test/gpac
可以启用基于 FFMpeg 和 GPAC 的 mp4san 输出验证。
功能 mp4san-test/ffmpeg
需要安装以下 FFMpeg 库及其头文件
libavcodec
libavformat
libavutil
libswresample
libswscale
功能 mp4san-test/gpac
需要安装 libgpac >= 2.2
及其头文件。
集成测试 test_data
在私有的 test-data
子模块中的样本数据文件上运行。如果您有权访问此存储库,您可以手动检出子模块
$ git submodule update --init --checkout
在将样本数据文件添加到 mp4san-test-data
存储库之前,可以通过 mp4san-test-gen
处理样本数据文件上的集成测试。这将从样本文件中删除任何实际媒体数据,因为 mp4san
无论如何都不会读取它,只留下用于测试目的的元数据。这使得即使是非常大的媒体文件也可以被压缩成非常小的尺寸。
$ cargo run --bin mp4san-test-gen -- test-sample.mp4 test-data/test-sample.mp4.gz
模糊测试
支持通过 cargo afl
和 cargo fuzz
进行模糊测试。有关更多详细信息,请参阅 Rust Fuzz 书籍。要运行基于 AFL 的模糊测试
$ cargo install cargo-afl
$ cd fuzz-afl
$ ./fuzz $num_cpus
要运行基于 libFuzzer 的模糊测试
$ cargo +nightly install cargo-fuzz
$ cargo +nightly fuzz run sanitize -- -dict=fuzz/mp4.dict -seed_inputs=fuzz/input/ffmpeg-black-1f.mp4,fuzz/input/ffmpeg-smptebars-30f.mp4
OSS-Fuzz
连续模糊测试也由 OSS-Fuzz 提供。
许可
许可协议为 MIT。
依赖项
~1.5MB
~39K SLoC