11 个版本 (4 个破坏性更新)
0.5.1 | 2023年10月31日 |
---|---|
0.5.0 | 2023年10月22日 |
0.4.0 | 2023年10月17日 |
0.3.1 | 2023年5月16日 |
0.1.2 | 2023年3月21日 |
#30 in 视频
每月下载量 3,492
135KB
3K SLoC
mp4san — 
Rust MP4 格式 "净化器"。
目前净化器可以
- 返回输入中存在的所有呈现元数据,作为一个自包含的连续字节数组。
- 找到并返回包含(连续)媒体数据的输入中的指针。
"呈现"元数据意味着任何MP4播放器播放文件所需的元数据。"自包含和连续"意味着返回的元数据可以与媒体数据连接起来,形成一个有效的MP4文件。
不支持的MP4功能
净化器目前不支持
- "分段"MP4文件,这类文件主要用于自适应比特率流。
- 不连续的媒体数据,即穿插在呈现元数据(moov)中的媒体数据(mdat)盒子。
- 指向单独文件的媒体数据引用(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。
依赖关系
约2-3MB
约56K SLoC