mirror of
https://github.com/Hugoved/pyav1plus.git
synced 2026-07-15 18:10:05 +02:00
Update README.md
This commit is contained in:
@@ -1,2 +1,160 @@
|
|||||||
# pyav1plus
|
# pyav1plus
|
||||||
pyav1plus is a Python-based tool for extracting HDR10+ dynamic metadata from AV1 video streams, with support for IVF, MP4/fMP4, and MKV containers.
|
|
||||||
|
**pyav1plus** is a Python-based tool for extracting **HDR10+ dynamic metadata** from **AV1** video streams.
|
||||||
|
The project supports multiple AV1 container formats, including **IVF**, **MP4/fMP4**, and **Matroska (MKV)**, with direct parsing of AV1 OBUs and HDR10+ ITU-T T.35 metadata.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* Support for **AV1 IVF**
|
||||||
|
* Support for **AV1 MP4**
|
||||||
|
* Support for **AV1 fragmented MP4 (fMP4)**
|
||||||
|
* Support for **AV1 Matroska (MKV)**
|
||||||
|
* Direct parsing of **AV1 OBU metadata**
|
||||||
|
* Extraction of **HDR10+ ITU-T T.35 metadata**
|
||||||
|
* Automatic generation of classic HDR10+ JSON
|
||||||
|
* Stream-oriented parsing for large files
|
||||||
|
* Automatic input format detection
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
* Python 3.9 or higher
|
||||||
|
|
||||||
|
No external binaries or dependencies are required.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Basic:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python pyav1plus.py input.ivf
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python pyav1plus.py input.mp4
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python pyav1plus.py input.mkv
|
||||||
|
```
|
||||||
|
|
||||||
|
Custom output path:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python pyav1plus.py input.mp4 -o metadata.json
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Supported Formats
|
||||||
|
|
||||||
|
| Format | Supported |
|
||||||
|
| --- | --- |
|
||||||
|
| AV1 IVF | Yes |
|
||||||
|
| AV1 MP4 | Yes |
|
||||||
|
| AV1 Fragmented MP4 | Yes |
|
||||||
|
| AV1 MKV | Yes |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
The tool generates a classic HDR10+ JSON structure containing:
|
||||||
|
|
||||||
|
* `JSONInfo`
|
||||||
|
* `SceneInfo`
|
||||||
|
* `SceneInfoSummary`
|
||||||
|
* `ToolInfo`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Input:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python pyav1plus.py movie.mkv
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Input format: MKV
|
||||||
|
Scanning AV1 samples for HDR10+ metadata...
|
||||||
|
[■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■] 100.00%
|
||||||
|
|
||||||
|
Reordering metadata... Done.
|
||||||
|
Reading parsed dynamic metadata... Done.
|
||||||
|
Generating and writing metadata to JSON file...
|
||||||
|
Generating and writing metadata to JSON file... Done.
|
||||||
|
Frames written: 209557
|
||||||
|
Output: movie.json
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Script Example
|
||||||
|
|
||||||
|
```python
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
import pyav1plus
|
||||||
|
|
||||||
|
input_file = "input.mkv"
|
||||||
|
output_file = "metadata.json"
|
||||||
|
|
||||||
|
try:
|
||||||
|
input_format = pyav1plus.detect_input_format(input_file)
|
||||||
|
|
||||||
|
if input_format == "ivf":
|
||||||
|
iterator = pyav1plus.iter_ivf_samples(input_file)
|
||||||
|
elif input_format == "mp4":
|
||||||
|
iterator = pyav1plus.iter_mp4_samples(input_file)
|
||||||
|
elif input_format == "mkv":
|
||||||
|
iterator = pyav1plus.iter_mkv_samples(input_file)
|
||||||
|
else:
|
||||||
|
raise ValueError("Unsupported input format")
|
||||||
|
|
||||||
|
t35_by_frame = []
|
||||||
|
|
||||||
|
for index, payload, total in iterator:
|
||||||
|
t35 = pyav1plus.extract_t35_from_av1_sample(payload, index)
|
||||||
|
t35_by_frame.append(t35)
|
||||||
|
|
||||||
|
metadata = pyav1plus.build_classic_json_from_t35_list(t35_by_frame)
|
||||||
|
|
||||||
|
with open(output_file, "w", encoding="utf-8") as file:
|
||||||
|
json.dump(metadata, file, indent=2)
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
raise SystemExit(130)
|
||||||
|
except Exception as error:
|
||||||
|
print(f"Extraction failed: {error}", file=sys.stderr)
|
||||||
|
raise SystemExit(1)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
This project focuses specifically on **AV1 HDR10+ metadata extraction**.
|
||||||
|
The parser operates directly on AV1 bitstreams and container structures without relying on external multimedia frameworks.
|
||||||
|
|
||||||
|
Different MP4 layouts are supported, including fragmented and non-fragmented variants commonly found in streaming workflows.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Issues and Support
|
||||||
|
|
||||||
|
If you encounter any issues, please open an issue in the repository.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Acknowledgements
|
||||||
|
|
||||||
|
Thank you for your interest in this project.
|
||||||
|
|||||||
Reference in New Issue
Block a user