Skip to main content

A module to parse, analyze and validate MPEG-DASH MPD

Project description

mpd-inspector

Python module to parse MPEG-DASH Media Presentation Documents (aka. MPD) from files or URLs, and inspect them. With support for SCTE35 events (binary and/or XML).

Overview

The library provides two main components: the MPDParser and the MPDInspector. The MPDParser is responsible for parsing the MPD XML content (from a file, URL, or string) into a structured Python object model, converting attributes into native Python types where appropriate. It is meant to be a one-to-one mapping of the content of the MPD file to the object model.

The MPDInspector takes a parsed MPD object and provides a higher-level interface for analysis and interpretation. It calculates implicit and derived values (such as segment URLs based on templates, or accurate start/end times for periods), determines provenance for values, and offers helper methods for common tasks like checking if a presentation is live or on-demand.

Origin

This package was initially built as a fork from the excellent mpd-parser. The main reasons for forking it are:

  1. I needed to change the behaviour to be closer to the MPEG-DASH spec, in particular DASH-IF IOP rules.
  2. I wanted to parse all MPD attributes into native Python types (including for datetimes and durations)
  3. I wanted to be able to expose unparsed elements
  4. I wanted to add a layer of inspection/analysis to make it possible to calculate implicit/derived values (eg. start and duration of periods in multi-period MPD) - in particular again for validation against the DASH-IF Interoperability guidance
  5. I wanted to add support for SCTE35 Events (both as binary and XML)

Installation

$ python -m pip install mpd-inspector

Usage

Parsing a MPD manifest

from mpd_inspector import MPDParser, MPDInspector

from string

with open("path/to/file.mpd", mode="r") as manifest_file:
    mpd_string = manifest_file.read()
    parsed_mpd = MPDParser.from_string(mpd_string)

from file

input_file = "path/to/file.mpd"
mpd = MPDParser.from_file(input_file)

from url

input_url = "https://my-server.com/path/to/stream.mpd"
mpd = MPDParser.from_url(input_url)

Inspecting the MPD manifest

Once you have a parsed MPD object (mpd), you can create an inspector:

inspector = MPDInspector(mpd)

# Check basic MPD properties
print(f"MPD ID: {inspector.id}")
print(f"Type: {'Live' if inspector.is_live() else 'VOD'}")
if inspector.is_live():
    print(f"Availability Start Time: {inspector.availability_start_time}")
else:
    print(f"Media Presentation Duration: {inspector.media_presentation_duration}")

# Iterate through Periods
for period in inspector.periods:
    print(f"  Period {period.sequence} Start: {period.start_time}, Duration: {period.duration}")
    print(f"    Duration Provenance: {period.get_value_provenance('duration')}") # EXPLICIT, DERIVED, DEFAULT

    # Iterate through Adaptation Sets (Video, Audio, etc.)
    for adap_set in period.adaptation_sets:
        print(f"    Adaptation Set MIME Type: {adap_set.mime_type}")

        # Iterate through Representations (different bitrates/resolutions)
        for representation in adap_set.representations:
            print(f"      Representation ID: {representation.id}, Bandwidth: {representation.bandwidth}")

            # Get segment information
            segment_info = representation.segment_information
            print(f"        Segment Addressing Mode: {segment_info.addressing_mode}") # e.g., SIMPLE, EXPLICIT

            # Get segment URLs (using a generator)
            # Note: For large manifests, avoid converting the generator to a list immediately
            segment_generator = segment_info.segments
            try:
                first_segment = next(segment_generator)
                print(f"        First Segment URL(s): {first_segment.urls}")
                print(f"        First Segment Start Time: {first_segment.start_time}")
                print(f"        First Segment Duration: {first_segment.duration}")
            except StopIteration:
                print("        No segments found for this representation.")

For more examples, I would suggest looking at the tests.

Example manifests

There are a variety of example manifests in the manifests directory, coming from a variety of sources.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mpd_inspector-1.2.0.tar.gz (22.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mpd_inspector-1.2.0-py3-none-any.whl (25.2 kB view details)

Uploaded Python 3

File details

Details for the file mpd_inspector-1.2.0.tar.gz.

File metadata

  • Download URL: mpd_inspector-1.2.0.tar.gz
  • Upload date:
  • Size: 22.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.11.7 Darwin/24.6.0

File hashes

Hashes for mpd_inspector-1.2.0.tar.gz
Algorithm Hash digest
SHA256 9e512113cc5325e49f584c310a61c1099d49532f23400fc236dabdcd484381fb
MD5 3d8f482bfee72db98774d67a8d5fc4be
BLAKE2b-256 af7b0a56ada6ffc0e9b2e0970c1f7780601e356c8738bbe5aaf7f13a11e065e0

See more details on using hashes here.

File details

Details for the file mpd_inspector-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: mpd_inspector-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 25.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.11.7 Darwin/24.6.0

File hashes

Hashes for mpd_inspector-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d8184b17bbe2fefaf582b0886746f38cb61fd987d8cef936a747d3ca80f59ed6
MD5 969d8c95d8e22dd3a4159a6b616d7915
BLAKE2b-256 1fae34f02494e4b94a4d2a4f5983050ba4ce0b1bc33a1572b82f23b65a69617f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page