{"id":42359185,"url":"https://github.com/marlboro-advance/mediainfoandroid","last_synced_at":"2026-01-27T17:03:59.894Z","repository":{"id":320560419,"uuid":"1082496236","full_name":"marlboro-advance/mediainfoAndroid","owner":"marlboro-advance","description":"An Android library wrapper for MediaInfoLib, providing comprehensive media file analysis capabilities. Extract detailed technical and tag information from video, audio, and image files directly in your Android app.","archived":false,"fork":false,"pushed_at":"2025-11-02T07:59:58.000Z","size":3395,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-02T08:28:55.680Z","etag":null,"topics":["aar","android","jitpack-android","library","mediainfolib","wrapper"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marlboro-advance.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-24T10:24:48.000Z","updated_at":"2025-11-02T07:59:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"afc3b2f5-bec6-4a35-9ad4-11327e90106d","html_url":"https://github.com/marlboro-advance/mediainfoAndroid","commit_stats":null,"previous_names":["marlboro-advance/mediainfoandroid"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/marlboro-advance/mediainfoAndroid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlboro-advance%2FmediainfoAndroid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlboro-advance%2FmediainfoAndroid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlboro-advance%2FmediainfoAndroid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlboro-advance%2FmediainfoAndroid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marlboro-advance","download_url":"https://codeload.github.com/marlboro-advance/mediainfoAndroid/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlboro-advance%2FmediainfoAndroid/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28816572,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T12:25:15.069Z","status":"ssl_error","status_checked_at":"2026-01-27T12:25:05.297Z","response_time":168,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aar","android","jitpack-android","library","mediainfolib","wrapper"],"created_at":"2026-01-27T17:03:47.104Z","updated_at":"2026-01-27T17:03:59.872Z","avatar_url":"https://github.com/marlboro-advance.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MediaInfo Android Library\n\n[![](https://jitpack.io/v/marlboro-advance/mediainfoAndroid.svg)](https://jitpack.io/#marlboro-advance/mediainfoAndroid)\n[![Android Build CI](https://github.com/marlboro-advance/mediainfoAndroid/actions/workflows/build.yml/badge.svg)](https://github.com/marlboro-advance/mediainfoAndroid/actions/workflows/build.yml)\n\nAn Android library wrapper for [MediaInfoLib](https://mediaarea.net/MediaInfo), providing\ncomprehensive media file analysis capabilities. Extract detailed technical and tag information from\nvideo, audio, and image files directly in your Android app.\n\n## Features\n\n- **Complete Media Analysis** - Get detailed information about video, audio, text, and other streams\n- **Multiple Output Formats** - XML, JSON, Text, HTML, PBCore, EBUCore\n- **Easy to Use** - Simple API with both high-level utilities and low-level access\n- **Native Performance** - Built on top of the robust MediaInfoLib C++ library\n- **Android Optimized** - Supports all major architectures (arm64-v8a, armeabi-v7a, x86, x86_64)\n- **Modern Android** - Supports Android 5.0 (API 21) and above\n\n## Installation\n\n### Step 1: Add JitPack repository\n\nAdd the JitPack repository to your project's `settings.gradle` or `settings.gradle.kts`:\n\n**Groovy (`settings.gradle`):**\n\n```groovy\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\n**Kotlin (`settings.gradle.kts`):**\n\n```kotlin\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n        maven { url = uri(\"https://jitpack.io\") }\n    }\n}\n```\n\n### Step 2: Add the dependency\n\nAdd the MediaInfo library to your app's `build.gradle` or `build.gradle.kts`:\n\n**Groovy (`build.gradle`):**\n\n```groovy\ndependencies {\n    implementation 'com.github.marlboro-advance:mediainfoAndroid:v1.0.0-fix'\n}\n```\n\n**Kotlin (`build.gradle.kts`):**\n\n```kotlin\ndependencies {\n    implementation(\"com.github.marlboro-advance:mediainfoAndroid:v1.0.0-fix\")\n}\n```\n\n## Quick Start\n\n### Using the Simple Utility API\n\nThe easiest way to get media information is using the `MediaInfoUtil` class:\n\n```kotlin\npackage com.example.mediainfo\n\nimport android.net.Uri\nimport android.os.ParcelFileDescriptor\nimport net.mediaarea.mediainfo.lib.MediaInfoUtil\n\nfun getMediaInfo(uri: Uri) {\n    val pfd: ParcelFileDescriptor? = contentResolver.openFileDescriptor(uri, \"r\")\n    val fd = pfd?.detachFd() ?: return\n    \n    try {\n        // Get XML output (recommended format)\n        val xmlOutput = MediaInfoUtil.getMediaInfoXml(fd, \"video.mp4\")\n        println(xmlOutput)\n    } finally {\n        pfd?.close()\n    }\n}\n```\n\n### Get Different Output Formats\n\n```kotlin\npackage com.example.mediainfo\n\nimport net.mediaarea.mediainfo.lib.MediaInfoUtil\n\n// XML format (most detailed)\nval xmlOutput = MediaInfoUtil.getMediaInfo(fd, \"video.mp4\", \"MIXML\")\n\n// JSON format\nval jsonOutput = MediaInfoUtil.getMediaInfo(fd, \"video.mp4\", \"JSON\")\n\n// Human-readable text (like MediaInfo desktop app)\nval textOutput = MediaInfoUtil.getMediaInfo(fd, \"video.mp4\", \"Text\")\n\n// HTML format\nval htmlOutput = MediaInfoUtil.getMediaInfo(fd, \"video.mp4\", \"HTML\")\n```\n\n### Check Library Version\n\n```kotlin\npackage com.example.mediainfo\n\nimport net.mediaarea.mediainfo.lib.MediaInfoUtil\n\nval version = MediaInfoUtil.getVersion()\nprintln(\"MediaInfo version: $version\")\n```\n\n## Advanced Usage\n\n### Using the Low-Level API\n\nFor more control and to query specific parameters:\n\n```kotlin\npackage com.example.mediainfo\n\nimport net.mediaarea.mediainfo.lib.MediaInfo\n\nval mi = MediaInfo()\n\n// Open file\nmi.Open(fd, \"video.mp4\")\n\n// Get general information\nval format = mi.Get(MediaInfo.Stream.General, 0, \"Format\")\nval duration = mi.Get(MediaInfo.Stream.General, 0, \"Duration\")\nval fileSize = mi.Get(MediaInfo.Stream.General, 0, \"FileSize\")\n\n// Get video stream information\nval videoCount = mi.Count_Get(MediaInfo.Stream.Video)\nif (videoCount \u003e 0) {\n    val videoFormat = mi.Get(MediaInfo.Stream.Video, 0, \"Format\")\n    val width = mi.Get(MediaInfo.Stream.Video, 0, \"Width\")\n    val height = mi.Get(MediaInfo.Stream.Video, 0, \"Height\")\n    val frameRate = mi.Get(MediaInfo.Stream.Video, 0, \"FrameRate\")\n    val bitRate = mi.Get(MediaInfo.Stream.Video, 0, \"BitRate\")\n    \n    println(\"Video: $videoFormat ${width}x${height} @ $frameRate fps, $bitRate bps\")\n}\n\n// Get audio stream information\nval audioCount = mi.Count_Get(MediaInfo.Stream.Audio)\nfor (i in 0 until audioCount) {\n    val audioFormat = mi.Get(MediaInfo.Stream.Audio, i, \"Format\")\n    val channels = mi.Get(MediaInfo.Stream.Audio, i, \"Channels\")\n    val sampleRate = mi.Get(MediaInfo.Stream.Audio, i, \"SamplingRate\")\n    \n    println(\"Audio $i: $audioFormat, $channels channels, $sampleRate Hz\")\n}\n\n// Get human-readable text output\nmi.Option(\"Inform\", \"Text\")\nval textReport = mi.Inform()\nprintln(textReport)\n\n// Close\nmi.Close()\n```\n\n### Output Format Options\n\nThe library supports multiple output formats through the `Inform` option:\n\n| Format    | Description          | Use Case                         |\n|-----------|----------------------|----------------------------------|\n| `Text`    | Human-readable text  | Display to users, logs           |\n| `MIXML`   | MediaInfo XML format | Structured parsing (recommended) |\n| `JSON`    | JSON format          | API integration, web apps        |\n| `HTML`    | HTML format          | Web pages, reports               |\n| `XML`     | Alternative XML      | Legacy compatibility             |\n| `PBCore`  | PBCore 2.0 XML       | Broadcasting metadata            |\n| `EBUCore` | EBUCore 1.8 XML      | European broadcast standard      |\n\nExample with custom format:\n\n```kotlin\npackage com.example.mediainfo\n\nimport net.mediaarea.mediainfo.lib.MediaInfo\n\nval mi = MediaInfo()\nmi.Open(fd, \"video.mp4\")\n\n// Get text format output\nmi.Option(\"Inform\", \"Text\")\nval textOutput = mi.Inform()\n\n// Get JSON format output\nmi.Option(\"Inform\", \"JSON\")\nval jsonOutput = mi.Inform()\n\nmi.Close()\n```\n\n## Stream Types\n\nThe library supports the following stream types:\n\n- `MediaInfo.Stream.General` - General container information\n- `MediaInfo.Stream.Video` - Video stream data\n- `MediaInfo.Stream.Audio` - Audio stream data\n- `MediaInfo.Stream.Text` - Subtitle/caption data\n- `MediaInfo.Stream.Image` - Image data\n- `MediaInfo.Stream.Menu` - Menu/chapter data\n- `MediaInfo.Stream.Other` - Other streams\n\n## Complete Example\n\nHere's a complete example in an Android Activity:\n\n```kotlin\npackage com.example.mediainfo\n\nimport android.net.Uri\nimport android.os.Bundle\nimport android.os.ParcelFileDescriptor\nimport android.widget.Button\nimport android.widget.TextView\nimport android.widget.Toast\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport net.mediaarea.mediainfo.lib.MediaInfo\n\nclass MainActivity : AppCompatActivity() {\n    \n    private val pickMediaLauncher = registerForActivityResult(\n        ActivityResultContracts.OpenDocument()\n    ) { uri -\u003e\n        uri?.let { analyzeMedia(it) }\n    }\n    \n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n        \n        findViewById\u003cButton\u003e(R.id.btnPickFile).setOnClickListener {\n            pickMediaLauncher.launch(arrayOf(\"video/*\", \"audio/*\"))\n        }\n    }\n    \n    private fun analyzeMedia(uri: Uri) {\n        lifecycleScope.launch(Dispatchers.IO) {\n            try {\n                val pfd: ParcelFileDescriptor? = contentResolver.openFileDescriptor(uri, \"r\")\n                val fd = pfd?.detachFd() ?: return@launch\n                \n                val mi = MediaInfo()\n                mi.Open(fd, uri.lastPathSegment ?: \"unknown\")\n                \n                // Build detailed report\n                val report = buildString {\n                    appendLine(\"=== GENERAL INFO ===\")\n                    appendLine(\"Format: ${mi.Get(MediaInfo.Stream.General, 0, \"Format\")}\")\n                    appendLine(\"Duration: ${mi.Get(MediaInfo.Stream.General, 0, \"Duration/String\")}\")\n                    appendLine(\"File Size: ${mi.Get(MediaInfo.Stream.General, 0, \"FileSize/String\")}\")\n                    appendLine()\n                    \n                    val videoCount = mi.Count_Get(MediaInfo.Stream.Video)\n                    for (i in 0 until videoCount) {\n                        appendLine(\"=== VIDEO STREAM $i ===\")\n                        appendLine(\"Format: ${mi.Get(MediaInfo.Stream.Video, i, \"Format\")}\")\n                        appendLine(\"Resolution: ${mi.Get(MediaInfo.Stream.Video, i, \"Width\")}x${mi.Get(MediaInfo.Stream.Video, i, \"Height\")}\")\n                        appendLine(\"Frame Rate: ${mi.Get(MediaInfo.Stream.Video, i, \"FrameRate\")} fps\")\n                        appendLine(\"Bit Rate: ${mi.Get(MediaInfo.Stream.Video, i, \"BitRate/String\")}\")\n                        appendLine()\n                    }\n                    \n                    val audioCount = mi.Count_Get(MediaInfo.Stream.Audio)\n                    for (i in 0 until audioCount) {\n                        appendLine(\"=== AUDIO STREAM $i ===\")\n                        appendLine(\"Format: ${mi.Get(MediaInfo.Stream.Audio, i, \"Format\")}\")\n                        appendLine(\"Channels: ${mi.Get(MediaInfo.Stream.Audio, i, \"Channels\")}\")\n                        appendLine(\"Sample Rate: ${mi.Get(MediaInfo.Stream.Audio, i, \"SamplingRate\")} Hz\")\n                        appendLine(\"Bit Rate: ${mi.Get(MediaInfo.Stream.Audio, i, \"BitRate/String\")}\")\n                        appendLine()\n                    }\n                }\n                \n                mi.Close()\n                pfd?.close()\n                \n                withContext(Dispatchers.Main) {\n                    findViewById\u003cTextView\u003e(R.id.tvOutput).text = report\n                }\n            } catch (e: Exception) {\n                e.printStackTrace()\n                withContext(Dispatchers.Main) {\n                    Toast.makeText(this@MainActivity, \"Error: ${e.message}\", Toast.LENGTH_LONG).show()\n                }\n            }\n        }\n    }\n}\n```\n\n## Permissions\n\nAdd the necessary permissions to your `AndroidManifest.xml`:\n\n```xml\n\u003c!-- For Android 12 and below --\u003e\n\u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"\n    android:maxSdkVersion=\"32\" /\u003e\n\n\u003c!-- For Android 13 and above --\u003e\n\u003cuses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" /\u003e\n\u003cuses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" /\u003e\n```\n\nFor Android 11+ (API 30+), it's recommended to use the Storage Access Framework (as shown in the\nexample above) to avoid requiring `MANAGE_EXTERNAL_STORAGE` permission.\n\n## Supported Formats\n\nMediaInfo supports a wide range of media formats including:\n\n**Video Containers:** MP4, MKV, AVI, MOV, FLV, WebM, WMV, MPEG, TS, M2TS, VOB, and many more\n\n**Video Codecs:** H.264/AVC, H.265/HEVC, VP8, VP9, AV1, MPEG-2, MPEG-4, DivX, Xvid, and many more\n\n**Audio Containers:** MP3, AAC, FLAC, WAV, OGG, WMA, M4A, OPUS, and many more\n\n**Audio Codecs:** MP3, AAC, FLAC, Vorbis, Opus, AC3, DTS, PCM, and many more\n\n**Images:** JPEG, PNG, BMP, GIF, TIFF, WebP, and more\n\n## Requirements\n\n- **Minimum SDK:** API 21 (Android 5.0 Lollipop)\n- **Target SDK:** API 36 (Android 15)\n- **JDK:** Java 21 or higher\n- **Supported ABIs:** armeabi-v7a, arm64-v8a, x86, x86_64\n\n## Building from Source\n\n```bash\n# Clone the repository\ngit clone https://github.com/marlboro-advance/mediainfoAndroid.git\ncd mediainfoAndroid\n\n# Initialize submodules\ngit submodule update --init --recursive\n\n# Build the library\n./gradlew build\n\n# Or build release AAR\n./gradlew :mediainfo-lib:assembleRelease\n```\n\nThe AAR will be generated in `mediainfo-lib/build/outputs/aar/`.\n\n## ProGuard/R8\n\nIf you're using ProGuard or R8, the library should work out of the box. The consumer ProGuard rules\nare included in the AAR to preserve the native JNI methods.\n\n## License\n\nThis library is released under the BSD-2-Clause License. See the [LICENSE](LICENSE) file for\ndetails.\n\nMediaInfoLib is Copyright (c) MediaArea.net SARL. All Rights Reserved.\n\n## Credits\n\n- Built on [MediaInfoLib](https://github.com/MediaArea/MediaInfoLib) by MediaArea.net\n- Uses [ZenLib](https://github.com/MediaArea/ZenLib) for core utilities\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarlboro-advance%2Fmediainfoandroid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarlboro-advance%2Fmediainfoandroid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarlboro-advance%2Fmediainfoandroid/lists"}