codecpy


Namecodecpy JSON
Version 0.1.1 PyPI version JSON
download
home_pagehttps://github.com/ReiDoBrega/codecpy
SummaryA comprehensive Python library for codec identification, normalization and media format analysis
upload_time2025-02-20 02:09:27
maintainerNone
docs_urlNone
authorReiDoBrega
requires_python>=3.7
licenseMIT
keywords codec media video audio format container mime-type h264 h265 aac mp4 webm matroska mkv hls dash
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # CodecPy 📊

![CodecPy Logo](https://raw.githubusercontent.com/ReiDoBrega/codecpy/main/assets/logo.png)

A professional Python library for processing and normalizing media codec strings to human-readable formats. CodecPy handles a wide range of audio and video codecs with comprehensive mapping and pattern recognition.

[![PyPI version](https://img.shields.io/badge/pypi-v1.0.0-blue.svg)](https://pypi.org/project/codecpy/)
[![Python versions](https://img.shields.io/badge/python-3.7%20%7C%203.8%20%7C%203.9%20%7C%203.10-blue)](https://www.python.org/downloads/)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)

## Features

- Normalize complex codec strings into human-readable formats
- Identify and classify audio, video, text, and image codecs
- Extract profile, level, and color information from codec strings
- Parse and create MIME types with codec parameters
- Determine codec compatibility with various container formats
- Suggest optimal containers for codec combinations

## Installation

```bash
pip install codecpy
```

## Quick Start

```python
from codecpy import CodecPy

# Basic codec normalization
codec_info = CodecPy.normalize_codec("avc1.640028")
print(f"Normalized codec: {codec_info.normalized}")  # Output: Normalized codec: H264

# Process MIME type with codecs
mime_str = 'video/mp4; codecs="avc1.640028, mp4a.40.2"'
codec_stream = CodecPy.decode_codec_string("avc1.640028, mp4a.40.2")
print(f"Video codec: {codec_stream.video_codec}")  # Output: Video codec: H264
print(f"Audio codec: {codec_stream.audio_codec}")  # Output: Audio codec: AAC_LC
```

## Documentation

### Core Classes

- `CodecInfo`: Normalized codec information
- `ProfileInfo`: Codec profile and level details
- `ColorInfo`: Video color space information
- `CodecDetails`: Comprehensive codec details
- `ContainerInfo`: Container format information
- `CodecStreamInfo`: Multi-codec stream information
- `MimeTypeInfo`: MIME type parsing results

### Basic Usage

#### Normalize a Codec

```python
from codecpy import CodecPy

# Normalize a video codec
codec_info = CodecPy.normalize_codec("avc1.640028")
print(f"Original: {codec_info.original}")
print(f"Normalized: {codec_info.normalized}")
print(f"Type: {codec_info.type.to_string()}")
print(f"Technical ID: {codec_info.technical_id}")
print(f"Family: {codec_info.family}")
```

Output:
```
Original: avc1.640028
Normalized: H264
Type: video
Technical ID: avc1
Family: H264
```

#### Parse audio channels 

```python
# Basic audio codec identification
aac_info = codex.normalize_codec("mp4a.40.2", "audio")
print(f"Codec: {aac_info.normalized}")  # Outputs: "Codec: AAC_LC"

# Detailed audio codec information with channels
ac3_details = codex.get_audio_codec_details("ac-3", "A000", 48000, 16)
print(f"Audio: {ac3_details.normalized} {ac3_details.channels}")  # Outputs: "Audio: AC3 5.1"

# Process from string representation
atmos_details = codex.get_audio_codec_details("ec-3", "15/JOC", 48000)
print(f"Format: {atmos_details.normalized} Atmos {atmos_details.channels}")  # Outputs: "Format: EAC3 Atmos 16.0"

```

Output:
```
Codec: AAC_LC
Audio: AC3 5.1
Format: EAC3 Atmos 16.0
```

#### Get Detailed Codec Information

```python
# Get comprehensive codec details including profile information
details = CodecPy.get_codec_details("avc1.640028")
print(f"Codec: {details.normalized}")
if details.profiles and details.profiles.has_profile:
    print(f"Profile: {details.profiles.profile}")
    print(f"Level: {details.profiles.level}")
```

Output:
```
Codec: H264
Profile: High
Level: 4.0
```

#### Process Multiple Codecs in a Stream

```python
# Process a codec string with multiple codecs
codec_stream = CodecPy.decode_codec_string("avc1.640028, mp4a.40.2")
print(f"Has video: {codec_stream.has_video}")
print(f"Has audio: {codec_stream.has_audio}")
print(f"Video codec: {codec_stream.video_codec}")
print(f"Audio codec: {codec_stream.audio_codec}")

# Get individual codec details
for codec in codec_stream.codecs:
    print(f"- {codec.type.to_string()}: {codec.normalized}")
```

Output:
```
Has video: True
Has audio: True
Video codec: H264
Audio codec: AAC_LC
- video: H264
- audio: AAC_LC
```

### MIME Type Handling

#### Parse a MIME Type

```python
from codecpy.mime import MimeTypeUtil

mime_str = 'video/mp4; codecs="avc1.640028, mp4a.40.2"'
mime_info = MimeTypeUtil.parse_mime_type(mime_str)

print(f"Full type: {mime_info.full_type}")
print(f"Main type: {mime_info.main_type}")
print(f"Sub type: {mime_info.sub_type}")
print(f"Codecs: {mime_info.codecs_parameter}")
```

Output:
```
Full type: video/mp4
Main type: video
Sub type: mp4
Codecs: ['avc1.640028', 'mp4a.40.2']
```

#### Process MIME Type with Codecs

```python
# Process MIME type with CodecPy
container, codecs = CodecPy.process_mime_type(mime_str)
print(f"Container: {container}")
for codec in codecs:
    print(f"- {codec.type.to_string()}: {codec.normalized}")
```

Output:
```
Container: video/mp4
- video: H264
- audio: AAC_LC
```

#### Create MIME Type for Codec Combination

```python
# Create a MIME type string for a video/audio codec pair
mime_type = CodecPy.create_mime_type_for_codecs('mp4', 'avc1.640028', 'mp4a.40.2')
print(f"Generated MIME type: {mime_type}")
```

Output:
```
Generated MIME type: video/mp4; codecs="avc1, mp4a.40.2"
```

### Container Compatibility

#### Check Codec Compatibility

```python
# Check if a codec is compatible with a container
is_compatible = CodecPy.is_codec_compatible("avc1.640028", "mp4")
print(f"H.264 compatible with MP4: {is_compatible}")

is_compatible = CodecPy.is_codec_compatible("vp9", "mp4")
print(f"VP9 compatible with MP4: {is_compatible}")
```

Output:
```
H.264 compatible with MP4: True
VP9 compatible with MP4: True
```

#### Suggest Compatible Containers

```python
# Get container suggestions for codec combination
containers = CodecPy.suggest_container("h265", "aac")
print(f"Compatible containers for H.265 + AAC: {containers}")
```

Output:
```
Compatible containers for H.265 + AAC: ['mp4', 'mkv']
```

### Advanced Usage: Detailed Profile Information

```python
# Extract profile and level information from complex codec strings
test_codecs = [
    "avc1.640028",
    "hev1.1.6.L150.B0",
    "vp9.2",
    "mp4a.40.2",
    "dts-hdma"
]

for codec in test_codecs:
    result = CodecPy.get_codec_details(codec)
    print(f"\nOriginal: {codec}")
    print(f"Normalized: {result.normalized}")
    print(f"Type: {result.type.to_string()}")
    if result.profiles and result.profiles.has_profile:
        print(f"Profile: {result.profiles.profile}")
        if result.profiles.level:
            print(f"Level: {result.profiles.level}")
```

Output:
```
Original: avc1.640028
Normalized: H264
Type: video
Profile: High
Level: 4.0

Original: hev1.1.6.L150.B0
Normalized: H265
Type: video
Profile: Profile 1
Tier: High
Level: 5.0

Original: vp9.2
Normalized: VP9_PROFILE_2
Type: video

Original: mp4a.40.2
Normalized: AAC_LC
Type: audio
Profile: AAC-LC

Original: dts-hdma
Normalized: DTS_HD_MA
Type: audio
Profile: HD Master Audio
```

## Batch Processing

```python
# Process multiple codec strings in one call
results = CodecPy.batch_process_codecs([
    "avc1.640028",
    "mp4a.40.2",
    "vp9.2"
])

for result in results:
    print(f"{result.original} → {result.normalized} ({result.type.to_string()})")
```

Output:
```
avc1.640028 → H264 (video)
mp4a.40.2 → AAC_LC (audio)
vp9.2 → VP9_PROFILE_2 (video)
```

## Debugging

Enable debug mode for detailed logging:

```python
codex = CodecPy(debug_mode=True)
# Now all operations will produce detailed logs
```

## Common Use Cases

### Media Player Development

```python
# Determine if a media file can be played based on codec support
video_codec = "avc1.640028"
audio_codec = "mp4a.40.2"
container = "mp4"

can_play_video = CodecPy.is_codec_compatible(video_codec, container)
can_play_audio = CodecPy.is_codec_compatible(audio_codec, container)

if can_play_video and can_play_audio:
    print("Media file can be played")
else:
    print("Unsupported format")
```

### Streaming Media Server

```python
# Generate compatible MIME types for adaptive streaming manifests
video_codec = "avc1.640028"
audio_codec = "mp4a.40.2"

mime_type = CodecPy.create_mime_type_for_codecs('mp4', video_codec, audio_codec)
print(f"DASH/HLS MIME type: {mime_type}")
```

### Media Analytics

```python
# Parse codec information from media files for analytics
media_files = [
    "video1.mp4;avc1.640028,mp4a.40.2",
    "video2.webm;vp9,opus",
    "audio1.m4a;mp4a.40.2"
]

for file_info in media_files:
    container, codec_str = file_info.split(';')
    ext = container.split('.')[-1]
    codec_stream = CodecPy.decode_codec_string(codec_str)
    
    print(f"\nAnalyzing: {container}")
    print(f"Container: {CodecPy.identify_container(ext).format}")
    
    if codec_stream.has_video:
        print(f"Video codec: {codec_stream.video_codec}")
    if codec_stream.has_audio:
        print(f"Audio codec: {codec_stream.audio_codec}")
```

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

This project is licensed under the MIT License - see the LICENSE file for details.

## Acknowledgements

- [FFmpeg](https://ffmpeg.org/) - For reference codec implementation details
- [W3C Media Source Extensions](https://w3c.github.io/media-source/) - For codec string format specifications

---

Made with ❤️ for media developers

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ReiDoBrega/codecpy",
    "name": "codecpy",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "codec, media, video, audio, format, container, mime-type, h264, h265, aac, mp4, webm, matroska, mkv, hls, dash",
    "author": "ReiDoBrega",
    "author_email": "pedro94782079@gmail.com",
    "download_url": null,
    "platform": null,
    "description": "# CodecPy \ud83d\udcca\r\n\r\n![CodecPy Logo](https://raw.githubusercontent.com/ReiDoBrega/codecpy/main/assets/logo.png)\r\n\r\nA professional Python library for processing and normalizing media codec strings to human-readable formats. CodecPy handles a wide range of audio and video codecs with comprehensive mapping and pattern recognition.\r\n\r\n[![PyPI version](https://img.shields.io/badge/pypi-v1.0.0-blue.svg)](https://pypi.org/project/codecpy/)\r\n[![Python versions](https://img.shields.io/badge/python-3.7%20%7C%203.8%20%7C%203.9%20%7C%203.10-blue)](https://www.python.org/downloads/)\r\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT)\r\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\r\n\r\n## Features\r\n\r\n- Normalize complex codec strings into human-readable formats\r\n- Identify and classify audio, video, text, and image codecs\r\n- Extract profile, level, and color information from codec strings\r\n- Parse and create MIME types with codec parameters\r\n- Determine codec compatibility with various container formats\r\n- Suggest optimal containers for codec combinations\r\n\r\n## Installation\r\n\r\n```bash\r\npip install codecpy\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\nfrom codecpy import CodecPy\r\n\r\n# Basic codec normalization\r\ncodec_info = CodecPy.normalize_codec(\"avc1.640028\")\r\nprint(f\"Normalized codec: {codec_info.normalized}\")  # Output: Normalized codec: H264\r\n\r\n# Process MIME type with codecs\r\nmime_str = 'video/mp4; codecs=\"avc1.640028, mp4a.40.2\"'\r\ncodec_stream = CodecPy.decode_codec_string(\"avc1.640028, mp4a.40.2\")\r\nprint(f\"Video codec: {codec_stream.video_codec}\")  # Output: Video codec: H264\r\nprint(f\"Audio codec: {codec_stream.audio_codec}\")  # Output: Audio codec: AAC_LC\r\n```\r\n\r\n## Documentation\r\n\r\n### Core Classes\r\n\r\n- `CodecInfo`: Normalized codec information\r\n- `ProfileInfo`: Codec profile and level details\r\n- `ColorInfo`: Video color space information\r\n- `CodecDetails`: Comprehensive codec details\r\n- `ContainerInfo`: Container format information\r\n- `CodecStreamInfo`: Multi-codec stream information\r\n- `MimeTypeInfo`: MIME type parsing results\r\n\r\n### Basic Usage\r\n\r\n#### Normalize a Codec\r\n\r\n```python\r\nfrom codecpy import CodecPy\r\n\r\n# Normalize a video codec\r\ncodec_info = CodecPy.normalize_codec(\"avc1.640028\")\r\nprint(f\"Original: {codec_info.original}\")\r\nprint(f\"Normalized: {codec_info.normalized}\")\r\nprint(f\"Type: {codec_info.type.to_string()}\")\r\nprint(f\"Technical ID: {codec_info.technical_id}\")\r\nprint(f\"Family: {codec_info.family}\")\r\n```\r\n\r\nOutput:\r\n```\r\nOriginal: avc1.640028\r\nNormalized: H264\r\nType: video\r\nTechnical ID: avc1\r\nFamily: H264\r\n```\r\n\r\n#### Parse audio channels \r\n\r\n```python\r\n# Basic audio codec identification\r\naac_info = codex.normalize_codec(\"mp4a.40.2\", \"audio\")\r\nprint(f\"Codec: {aac_info.normalized}\")  # Outputs: \"Codec: AAC_LC\"\r\n\r\n# Detailed audio codec information with channels\r\nac3_details = codex.get_audio_codec_details(\"ac-3\", \"A000\", 48000, 16)\r\nprint(f\"Audio: {ac3_details.normalized} {ac3_details.channels}\")  # Outputs: \"Audio: AC3 5.1\"\r\n\r\n# Process from string representation\r\natmos_details = codex.get_audio_codec_details(\"ec-3\", \"15/JOC\", 48000)\r\nprint(f\"Format: {atmos_details.normalized} Atmos {atmos_details.channels}\")  # Outputs: \"Format: EAC3 Atmos 16.0\"\r\n\r\n```\r\n\r\nOutput:\r\n```\r\nCodec: AAC_LC\r\nAudio: AC3 5.1\r\nFormat: EAC3 Atmos 16.0\r\n```\r\n\r\n#### Get Detailed Codec Information\r\n\r\n```python\r\n# Get comprehensive codec details including profile information\r\ndetails = CodecPy.get_codec_details(\"avc1.640028\")\r\nprint(f\"Codec: {details.normalized}\")\r\nif details.profiles and details.profiles.has_profile:\r\n    print(f\"Profile: {details.profiles.profile}\")\r\n    print(f\"Level: {details.profiles.level}\")\r\n```\r\n\r\nOutput:\r\n```\r\nCodec: H264\r\nProfile: High\r\nLevel: 4.0\r\n```\r\n\r\n#### Process Multiple Codecs in a Stream\r\n\r\n```python\r\n# Process a codec string with multiple codecs\r\ncodec_stream = CodecPy.decode_codec_string(\"avc1.640028, mp4a.40.2\")\r\nprint(f\"Has video: {codec_stream.has_video}\")\r\nprint(f\"Has audio: {codec_stream.has_audio}\")\r\nprint(f\"Video codec: {codec_stream.video_codec}\")\r\nprint(f\"Audio codec: {codec_stream.audio_codec}\")\r\n\r\n# Get individual codec details\r\nfor codec in codec_stream.codecs:\r\n    print(f\"- {codec.type.to_string()}: {codec.normalized}\")\r\n```\r\n\r\nOutput:\r\n```\r\nHas video: True\r\nHas audio: True\r\nVideo codec: H264\r\nAudio codec: AAC_LC\r\n- video: H264\r\n- audio: AAC_LC\r\n```\r\n\r\n### MIME Type Handling\r\n\r\n#### Parse a MIME Type\r\n\r\n```python\r\nfrom codecpy.mime import MimeTypeUtil\r\n\r\nmime_str = 'video/mp4; codecs=\"avc1.640028, mp4a.40.2\"'\r\nmime_info = MimeTypeUtil.parse_mime_type(mime_str)\r\n\r\nprint(f\"Full type: {mime_info.full_type}\")\r\nprint(f\"Main type: {mime_info.main_type}\")\r\nprint(f\"Sub type: {mime_info.sub_type}\")\r\nprint(f\"Codecs: {mime_info.codecs_parameter}\")\r\n```\r\n\r\nOutput:\r\n```\r\nFull type: video/mp4\r\nMain type: video\r\nSub type: mp4\r\nCodecs: ['avc1.640028', 'mp4a.40.2']\r\n```\r\n\r\n#### Process MIME Type with Codecs\r\n\r\n```python\r\n# Process MIME type with CodecPy\r\ncontainer, codecs = CodecPy.process_mime_type(mime_str)\r\nprint(f\"Container: {container}\")\r\nfor codec in codecs:\r\n    print(f\"- {codec.type.to_string()}: {codec.normalized}\")\r\n```\r\n\r\nOutput:\r\n```\r\nContainer: video/mp4\r\n- video: H264\r\n- audio: AAC_LC\r\n```\r\n\r\n#### Create MIME Type for Codec Combination\r\n\r\n```python\r\n# Create a MIME type string for a video/audio codec pair\r\nmime_type = CodecPy.create_mime_type_for_codecs('mp4', 'avc1.640028', 'mp4a.40.2')\r\nprint(f\"Generated MIME type: {mime_type}\")\r\n```\r\n\r\nOutput:\r\n```\r\nGenerated MIME type: video/mp4; codecs=\"avc1, mp4a.40.2\"\r\n```\r\n\r\n### Container Compatibility\r\n\r\n#### Check Codec Compatibility\r\n\r\n```python\r\n# Check if a codec is compatible with a container\r\nis_compatible = CodecPy.is_codec_compatible(\"avc1.640028\", \"mp4\")\r\nprint(f\"H.264 compatible with MP4: {is_compatible}\")\r\n\r\nis_compatible = CodecPy.is_codec_compatible(\"vp9\", \"mp4\")\r\nprint(f\"VP9 compatible with MP4: {is_compatible}\")\r\n```\r\n\r\nOutput:\r\n```\r\nH.264 compatible with MP4: True\r\nVP9 compatible with MP4: True\r\n```\r\n\r\n#### Suggest Compatible Containers\r\n\r\n```python\r\n# Get container suggestions for codec combination\r\ncontainers = CodecPy.suggest_container(\"h265\", \"aac\")\r\nprint(f\"Compatible containers for H.265 + AAC: {containers}\")\r\n```\r\n\r\nOutput:\r\n```\r\nCompatible containers for H.265 + AAC: ['mp4', 'mkv']\r\n```\r\n\r\n### Advanced Usage: Detailed Profile Information\r\n\r\n```python\r\n# Extract profile and level information from complex codec strings\r\ntest_codecs = [\r\n    \"avc1.640028\",\r\n    \"hev1.1.6.L150.B0\",\r\n    \"vp9.2\",\r\n    \"mp4a.40.2\",\r\n    \"dts-hdma\"\r\n]\r\n\r\nfor codec in test_codecs:\r\n    result = CodecPy.get_codec_details(codec)\r\n    print(f\"\\nOriginal: {codec}\")\r\n    print(f\"Normalized: {result.normalized}\")\r\n    print(f\"Type: {result.type.to_string()}\")\r\n    if result.profiles and result.profiles.has_profile:\r\n        print(f\"Profile: {result.profiles.profile}\")\r\n        if result.profiles.level:\r\n            print(f\"Level: {result.profiles.level}\")\r\n```\r\n\r\nOutput:\r\n```\r\nOriginal: avc1.640028\r\nNormalized: H264\r\nType: video\r\nProfile: High\r\nLevel: 4.0\r\n\r\nOriginal: hev1.1.6.L150.B0\r\nNormalized: H265\r\nType: video\r\nProfile: Profile 1\r\nTier: High\r\nLevel: 5.0\r\n\r\nOriginal: vp9.2\r\nNormalized: VP9_PROFILE_2\r\nType: video\r\n\r\nOriginal: mp4a.40.2\r\nNormalized: AAC_LC\r\nType: audio\r\nProfile: AAC-LC\r\n\r\nOriginal: dts-hdma\r\nNormalized: DTS_HD_MA\r\nType: audio\r\nProfile: HD Master Audio\r\n```\r\n\r\n## Batch Processing\r\n\r\n```python\r\n# Process multiple codec strings in one call\r\nresults = CodecPy.batch_process_codecs([\r\n    \"avc1.640028\",\r\n    \"mp4a.40.2\",\r\n    \"vp9.2\"\r\n])\r\n\r\nfor result in results:\r\n    print(f\"{result.original} \u2192 {result.normalized} ({result.type.to_string()})\")\r\n```\r\n\r\nOutput:\r\n```\r\navc1.640028 \u2192 H264 (video)\r\nmp4a.40.2 \u2192 AAC_LC (audio)\r\nvp9.2 \u2192 VP9_PROFILE_2 (video)\r\n```\r\n\r\n## Debugging\r\n\r\nEnable debug mode for detailed logging:\r\n\r\n```python\r\ncodex = CodecPy(debug_mode=True)\r\n# Now all operations will produce detailed logs\r\n```\r\n\r\n## Common Use Cases\r\n\r\n### Media Player Development\r\n\r\n```python\r\n# Determine if a media file can be played based on codec support\r\nvideo_codec = \"avc1.640028\"\r\naudio_codec = \"mp4a.40.2\"\r\ncontainer = \"mp4\"\r\n\r\ncan_play_video = CodecPy.is_codec_compatible(video_codec, container)\r\ncan_play_audio = CodecPy.is_codec_compatible(audio_codec, container)\r\n\r\nif can_play_video and can_play_audio:\r\n    print(\"Media file can be played\")\r\nelse:\r\n    print(\"Unsupported format\")\r\n```\r\n\r\n### Streaming Media Server\r\n\r\n```python\r\n# Generate compatible MIME types for adaptive streaming manifests\r\nvideo_codec = \"avc1.640028\"\r\naudio_codec = \"mp4a.40.2\"\r\n\r\nmime_type = CodecPy.create_mime_type_for_codecs('mp4', video_codec, audio_codec)\r\nprint(f\"DASH/HLS MIME type: {mime_type}\")\r\n```\r\n\r\n### Media Analytics\r\n\r\n```python\r\n# Parse codec information from media files for analytics\r\nmedia_files = [\r\n    \"video1.mp4;avc1.640028,mp4a.40.2\",\r\n    \"video2.webm;vp9,opus\",\r\n    \"audio1.m4a;mp4a.40.2\"\r\n]\r\n\r\nfor file_info in media_files:\r\n    container, codec_str = file_info.split(';')\r\n    ext = container.split('.')[-1]\r\n    codec_stream = CodecPy.decode_codec_string(codec_str)\r\n    \r\n    print(f\"\\nAnalyzing: {container}\")\r\n    print(f\"Container: {CodecPy.identify_container(ext).format}\")\r\n    \r\n    if codec_stream.has_video:\r\n        print(f\"Video codec: {codec_stream.video_codec}\")\r\n    if codec_stream.has_audio:\r\n        print(f\"Audio codec: {codec_stream.audio_codec}\")\r\n```\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please feel free to submit a Pull Request.\r\n\r\n1. Fork the repository\r\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\r\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\r\n4. Push to the branch (`git push origin feature/amazing-feature`)\r\n5. Open a Pull Request\r\n\r\n## License\r\n\r\nThis project is licensed under the MIT License - see the LICENSE file for details.\r\n\r\n## Acknowledgements\r\n\r\n- [FFmpeg](https://ffmpeg.org/) - For reference codec implementation details\r\n- [W3C Media Source Extensions](https://w3c.github.io/media-source/) - For codec string format specifications\r\n\r\n---\r\n\r\nMade with \u2764\ufe0f for media developers\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A comprehensive Python library for codec identification, normalization and media format analysis",
    "version": "0.1.1",
    "project_urls": {
        "Bug Tracker": "https://github.com/ReiDoBrega/codecpy/issues",
        "Homepage": "https://github.com/ReiDoBrega/codecpy",
        "Repository": "https://github.com/ReiDoBrega/codecpy"
    },
    "split_keywords": [
        "codec",
        " media",
        " video",
        " audio",
        " format",
        " container",
        " mime-type",
        " h264",
        " h265",
        " aac",
        " mp4",
        " webm",
        " matroska",
        " mkv",
        " hls",
        " dash"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3cc8518608c4589bd52dbb942010fe5a652a6dbcc59fdb956f8288cf73daf8ef",
                "md5": "9b9fc0bbc6cf30df5accf15285274685",
                "sha256": "e5bc3c562cc67db97fe7743b265c8f4e8d1c50ecd5f2d701d1d52ae8211bd25e"
            },
            "downloads": -1,
            "filename": "codecpy-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9b9fc0bbc6cf30df5accf15285274685",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 16087,
            "upload_time": "2025-02-20T02:09:27",
            "upload_time_iso_8601": "2025-02-20T02:09:27.548608Z",
            "url": "https://files.pythonhosted.org/packages/3c/c8/518608c4589bd52dbb942010fe5a652a6dbcc59fdb956f8288cf73daf8ef/codecpy-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-20 02:09:27",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ReiDoBrega",
    "github_project": "codecpy",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "codecpy"
}
        
Elapsed time: 0.41624s