{"id":13784893,"url":"https://github.com/harmonoid/libwinmedia","last_synced_at":"2025-05-11T20:31:23.054Z","repository":{"id":44952241,"uuid":"382131597","full_name":"harmonoid/libwinmedia","owner":"harmonoid","description":"[Archived] A cross-platform simple media playback library for C/C++.","archived":true,"fork":false,"pushed_at":"2022-02-14T14:26:04.000Z","size":4812,"stargazers_count":40,"open_issues_count":6,"forks_count":12,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-05-08T05:49:41.753Z","etag":null,"topics":["aac","audio","audio-player","cpp","flac","flutter","linux","m4a","media-playback","mp3","music","ogg","opus","video","vorbis","webkit","windows","winrt"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/harmonoid.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"custom":["https://www.buymeacoffee.com/alexmercerind"]}},"created_at":"2021-07-01T19:06:34.000Z","updated_at":"2025-02-28T16:22:55.000Z","dependencies_parsed_at":"2022-09-09T21:10:37.905Z","dependency_job_id":null,"html_url":"https://github.com/harmonoid/libwinmedia","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harmonoid%2Flibwinmedia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harmonoid%2Flibwinmedia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harmonoid%2Flibwinmedia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harmonoid%2Flibwinmedia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/harmonoid","download_url":"https://codeload.github.com/harmonoid/libwinmedia/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253631986,"owners_count":21939370,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["aac","audio","audio-player","cpp","flac","flutter","linux","m4a","media-playback","mp3","music","ogg","opus","video","vorbis","webkit","windows","winrt"],"created_at":"2024-08-03T19:00:53.753Z","updated_at":"2025-05-11T20:31:19.673Z","avatar_url":"https://github.com/harmonoid.png","language":"C++","readme":"\u003ch1 align=\"center\"\u003e\u003ca href=\"https://github.com/libwinmedia/libwinmedia\"\u003elibwinmedia\u003c/a\u003e\u003c/h1\u003e\n\u003ch4 align=\"center\"\u003eA cross-platform media playback library for C/C++ \u0026 Flutter with good number of features.\u003c/h4\u003e\n\n## ⚠️ Deprecated\n\nThe project is now archived. Reasons are documented below:\n- **Inefficient Linux support:** I had few (personal) reasons because of which my media URIs were not playing in `GStreamer`, so I decided to summon a `WebKit` instance using [webview.h](https://github.com/webview/webview) to make a basic JS interop setup for using WebAudio API (which itself is based on GStreamer in WebKitGTK). A good advantage that Flutter provides over other electron.js like alternatives is that it doesn't start a webview instance / JavaScript runtime, but using this plugin puts Flutter's those advantages to no use. This also makes us unable to add various crucial features like audio device selection/enumeration or equalizer etc. in future because of limited set of WebAudio APIs.\n- **Unnecessary abstraction:** As I said Linux support is not worth using, it puts Windows implementation to no use aswell. The WinRT APIs that this library exposes in a C like interface can be used directly in the project because they're already very user friendly \u0026 easy to integrate. Using this library on Windows just adds another layer of abstraction.\n- **Unsafe:** Using library on certain language/locales will cause crashes, since it heavily uses `std::stof` and `std::stoi` when doing JS interop. It is both inefficient and unsafe.\n- **No backward compatibility:** The library is only usable on later Windows 10 versions or higher. A project targetting a very small market share isn't worth maintaining.\n- **No embedded Linux support:** The library cannot be used on non-GTK Flutter embedders like flutter-pi etc. A lot of questions/issues have been made about this \u0026 it is not possible unless one decides to rewrite Linux implementation. \n\nThe project was started as an internal Harmonoid dependency to provide Windows/Linux support for the time-being, while I was looking for other libraries to settle on. Now that it is no longer used \u0026 current implementation isn't _good enough_, I don't see any point in adding features, fixing bugs etc. Thus, I have decided to discontinue this project.\nYou are free to fork the project or use the code as allowed by the MIT license (which can be found in the [LICENSE](https://github.com/harmonoid/libwinmedia/blob/master/LICENSE) file).\n\nThankyou.\n\n## Example\n\nA very simple example can be as follows.\n\n### C++\n\n```cpp\n#include \"libwinmedia/libwinmedia.hpp\"\n\nint32_t main(int32_t ac, const char** av) {\n  using namespace std; \n  using namespace lwm;\n  if (ac \u003c 2) {\n    cout \u003c\u003c \"No URI provided.\\n\"\n         \u003c\u003c \"Example Usage:\\n\" \u003c\u003c av[0]\n         \u003c\u003c \" file://C:/alexmercerind/music.mp3\\n\" \u003c\u003c av[0]\n         \u003c\u003c \" https://alexmercerind.github.io/video.mp4\\n\";\n    return EXIT_FAILURE;\n  }\n  auto player = Player(0);\n  auto media = Media(av[1]);\n  player.Open(vector\u003cMedia\u003e{media});\n  player.Play();\n  player.events()-\u003ePosition([](int32_t position) -\u003e void {\n    cout \u003c\u003c \"Current playback position is \" \u003c\u003c position \u003c\u003c \" ms.\\n\";\n  });\n  cin.get();\n  return EXIT_SUCCESS;\n}\n```\n\n### Flutter\n\n**More about Flutter [here](https://github.com/harmonoid/libwinmedia/tree/master/flutter/README.md) or on the [pub.dev](https://pub.dev/packages/libwinmedia).**\n\n```yaml\ndependencies:\n  ...\n  libwinmedia: ^0.0.1\n```\n\n```dart\nimport 'package:libwinmedia/libwinmedia.dart';\n\nvoid main() {\n  LWM.initialize();\n  runApp(MyApp());\n}\n\nvoid demo() {\n  var player = Player(id: 0);\n  player.streams.medias.listen((List\u003cMedia\u003e medias) {});\n  player.streams.isPlaying.listen((bool isPlaying) {});\n  player.streams.isBuffering.listen((bool isBuffering) {});\n  player.streams.isCompleted.listen((bool isCompleted) {});\n  player.streams.position.listen((Duration position) {});\n  player.streams.duration.listen((Duration duration) {});\n  player.streams.index.listen((int index) {});\n  player.open([\n    Media(uri: 'https://www.example.com/media/music.mp3'),\n    Media(uri: 'file://C:/documents/video.mp4'),\n  ]);\n  player.play();\n  player.seek(Duration(seconds: 20));\n  player.nativeControls.update(\n    album: 'Fine Line',\n    albumArtist: 'Harry Styles',\n    trackCount: 12,\n    artist: 'Harry Styles',\n    title: 'Lights Up',\n    trackNumber: 1,\n    thumbnail: File('album_art.png'),\n  );\n}\n```\n\n## Bindings\n\n- [just_audio](https://pub.dev/packages/just_audio): Cross platform audio playback library for Flutter, working on Android, iOS, macOS, Windows, Linux \u0026 Web.\n- [libwinmedia-py](https://github.com/libwinmedia/libwinmedia-py): libwinmedia bindings for Python.\n- [libwinmedia.dart](https://pub.dev/packages/libwinmedia): libwinmedia bindings for Flutter.\n\n## Support\n\nConsider supporting the project by starring the repository or buying me a coffee.\n\n\u003ca href=\"https://www.buymeacoffee.com/alexmercerind\"\u003e\u003cimg src=\"https://img.buymeacoffee.com/button-api/?text=Buy me a coffee\u0026emoji=\u0026slug=alexmercerind\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff\"\u003e\u003c/a\u003e\n\nThanks a lot for your support.\n\n## Documentation\n\n### Setup\n\nFor using the library on Windows, you can download the pre-compiled shared library from the [releases page](https://github.com/harmonoid/libwinmedia/releases) \u0026 headers can be found [here](https://github.com/harmonoid/libwinmedia/tree/master/include).\n\n### Usage\n\n**Create a new player.**\n\n```cpp\nPlayer player = Player(0);\n```\n\n**Create a media to open inside player.**\n\n```cpp\nMedia media = Media(\"file://C:/alexmercerind/music.mp3\");\nint32_t duration = media.duration();\n```\n\n**Play the medias.**\n\n```cpp\nplayer.Open(std::vector\u003clwm::Media\u003e{media});\n```\n\n**Control playback.**\n\n```cpp\nplayer.Play();\n\nplayer.Pause();\n\nplayer.SetVolume(0.69);\n\nplayer.SetRate(1.2);\n\nplayer.Seek(10000);\n\nplayer.SetIsLooping(false);\n\nplayer.SetAudioBalance(1.0);\n```\n\n**Listen to playback events.**\n\n```cpp\nplayer.events()-\u003ePosition(\n  [=](int position) -\u003e void {}\n);\n\nplayer.events()-\u003eDuration(\n  [=](int duration) -\u003e void {}\n);\n\nplayer.events()-\u003eRate(\n  [=](float rate) -\u003e void {}\n);\n\nplayer.events()-\u003eVolume(\n  [=](float volume) -\u003e void {}\n);\n\nplayer.events()-\u003eIsPlaying(\n  [=](bool isPlaying) -\u003e void {}\n);\n\n// Other events.\n```\n\n**Create native system media controls.**\n\n![](https://github.com/libwinmedia/libwinmedia/blob/assets/native_controls.jpg)\n\nPass function as argument to receive event callbacks.\n\n```cpp\nauto controls = lwm::NativeControls(\n  [](auto button) -\u003e void {\n    if (button == NativeControlsButton::Play) std::cout \u003c\u003c \"Play clicked.\\n\";\n    if (button == NativeControlsButton::Pause) std::cout \u003c\u003c \"Pause clicked.\\n\";\n  }\n);\n```\n\nUpdate the native system media controls.\n\n```cpp\ncontrols.Update(\n  std::make_shared\u003clwm::MusicNativeControlState\u003e(\n    \"album_artist\",\n    \"album\",\n    \"track_count\",\n    \"artist\",\n    \"title\",\n    \"track_number\"\n  ),\n  \"file://C:/Users/Hitesh/Pictures/AlbumArt.PNG\"\n);\n```\n\nClear the native system media controls.\n\n```cpp\ncontrols.Dispose();\n```\n\n**Extract metadata tags.**\n\n```cpp\nauto tags = lwm::Tags::FromMusic(std::wstring(music_file));\nstd::wcout \u003c\u003c \"album        : \" \u003c\u003c tags.album() \u003c\u003c \".\\n\"\n           \u003c\u003c \"album_artist : \" \u003c\u003c tags.album_artist() \u003c\u003c \".\\n\"\n           \u003c\u003c \"bitrate      : \" \u003c\u003c tags.bitrate() \u003c\u003c \".\\n\";\n           \n// Other metadata tags.\n```\n\n**Extract album art.**\n\n```cpp\nlwm::Tags::ExtractThumbnail(\n  music_file,\n  TO_WIDESTRING(std::filesystem::current_path().string()),\n  \"ExtractedAlbumArt.PNG\",\n  lwm::ThumbnailMode::Music,\n  400\n);\n```\n\n**Show video in a window.**\n\nFor showing video, you must instantiate player as follows.\n\n```cpp\nPlayer player = Player(0, true);\n```\n\n**Control video output.**\n\n```cpp\nplayer.ShowWindow();\n\nplayer.CloseWindow();\n```\n\n## Notes\n\n### Windows\n\n**For showing video**\n\nYou need to embed a manifest with `maxversiontested` property to the generated executable. The library creates a separate win32 window on another thread \u0026 uses XAML islands to render the `MediaPlayerElement` in it (for showing video). Learn more [here](https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/host-standard-control-with-xaml-islands-cpp) \u0026 [here](https://docs.microsoft.com/en-us/cpp/build/how-to-embed-a-manifest-inside-a-c-cpp-application?view=msvc-160).\n\n```manifest\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cassembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\"\u003e\n    \u003ccompatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\"\u003e\n        \u003capplication\u003e\n            \u003cmaxversiontested Id=\"10.0.18362.0\"/\u003e\n            \u003csupportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" /\u003e\n        \u003c/application\u003e\n    \u003c/compatibility\u003e\n\u003c/assembly\u003e\n```\n\n## Aim\n\nThe main goals of creating [libwinmedia](https://github.com/libwinmedia/libwinmedia) are:\n- Having high-level, user friendly library for media playback in C++.\n- Having small footprint, by using already existing OS APIs.\n- Having necessary things like network playback, event callbacks etc.\n- Being able to build similar high-level bindings to other programming languages, by just looking up for methods inside a single shared library.\n- Supporting multiple playback instances.\n- Supporting media tag-parsing \u0026 other things like lockscreen/system notifications.\n- Being permissively licensed.\n- Being cross-platform **.\n\n** Currently only working on Windows \u0026 Linux.\n\n\n## License \n\nCopyright (c) 2021 Hitesh Kumar Saini \u003csaini123hitesh@gmail.com\u003e\n\nThis library \u0026 work under this repository is MIT licensed.\n\nContributions welcomed.\n","funding_links":["https://www.buymeacoffee.com/alexmercerind","https://img.buymeacoffee.com/button-api/?text=Buy"],"categories":["Packages"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharmonoid%2Flibwinmedia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fharmonoid%2Flibwinmedia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharmonoid%2Flibwinmedia/lists"}