{"id":27110880,"url":"https://github.com/bcc-code/bccm-player","last_synced_at":"2025-04-07T00:41:26.678Z","repository":{"id":185557904,"uuid":"673723873","full_name":"bcc-code/bccm-player","owner":"bcc-code","description":"Flutter package for video-heavy apps","archived":false,"fork":false,"pushed_at":"2024-04-11T12:21:42.000Z","size":26681,"stargazers_count":15,"open_issues_count":16,"forks_count":7,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-04-14T02:53:07.821Z","etag":null,"topics":["android","dart","dart-library","dartlang","flutter","flutter-package","flutter-plugin","ios","player","video"],"latest_commit_sha":null,"homepage":"https://bcc-code.github.io/bccm-player/","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bcc-code.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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}},"created_at":"2023-08-02T09:25:15.000Z","updated_at":"2024-04-17T13:46:39.924Z","dependencies_parsed_at":null,"dependency_job_id":"a4cdad1a-776e-4cb7-a357-dc3eb0200c39","html_url":"https://github.com/bcc-code/bccm-player","commit_stats":null,"previous_names":["bcc-code/bccm_player"],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcc-code%2Fbccm-player","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcc-code%2Fbccm-player/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcc-code%2Fbccm-player/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcc-code%2Fbccm-player/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bcc-code","download_url":"https://codeload.github.com/bcc-code/bccm-player/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247415960,"owners_count":20935388,"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":["android","dart","dart-library","dartlang","flutter","flutter-package","flutter-plugin","ios","player","video"],"created_at":"2025-04-07T00:41:26.109Z","updated_at":"2025-04-07T00:41:26.671Z","avatar_url":"https://github.com/bcc-code.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BccmPlayer - a flutter video player package\n\nNote: this is not proper open source. See [./LICENSE](./LICENSE)\n\nThis is a video player primarily designed for video-heavy apps that need features like background playback, PiP, casting, analytics, etc.\n\nUsed by the apps [Bible Kids](https://play.google.com/store/apps/details?id=media.bcc.kids) and [BCC Media](https://apps.apple.com/no/app/brunstadtv/id913268220).\n\n![Controls screenshot](https://github.com/bcc-code/bccm-player/blob/main/doc/demo/controls.jpg?raw=true)\n\n![Demo on android](https://github.com/bcc-code/bccm-player/blob/main/doc/demo/demo.gif?raw=true) \\_\n![Casting screenshot](https://github.com/bcc-code/bccm-player/blob/main/doc/demo/casting.jpg?raw=true)\n\n## Documentation\n\nFor all the features to work correctly, it's vital that you read the docs.\nDocumentation: https://bcc-code.github.io/bccm-player/\n\n## Difference from video_player/chewie/betterplayer, etc.\n\nA major difference is that BccmPlayer uses hybrid composition platform views to display the video instead of textures.\nThis means the video is rendered in the native view hierarchy without any intermediate steps, which has several benefits:\n\n- Native video performance\n- Subtitles are rendered by the native player (avplayer/exoplayer)\n- Can use native controls (`showControls` on [VideoPlatformView])\n\n## Platforms\n\n- [x] iOS\n- [x] Android\n- [ ] ~~Web~~. Some groundwork is there, but it's not complete and it's not supported.\n\n## Features\n\n- [x] Native video via hybrid composition\n- [x] HLS, DASH, MP4 (anything exoplayer and avplayer supports)\n- [x] Chromecast\n- [x] Background playback\n- [x] Picture in picture\n- [x] Notification center\n- [x] Audio track selection\n- [x] Subtitle track selection\n- [x] Fullscreen\n- [x] NPAW/Youbora analytics\n- [x] Metadata\n- [x] HDR content (read [HDR](https://bcc-code.github.io/bccm-player/advanced-usage/hdr-content/) in the docs)\n\n# Example\n\n```dart\nimport 'package:bccm_player/bccm_player.dart';\nimport 'package:flutter/material.dart';\n\nclass SimplePlayer extends StatefulWidget {\n  const SimplePlayer({super.key});\n\n  @override\n  State\u003cSimplePlayer\u003e createState() =\u003e _SimplePlayerState();\n}\n\nclass _SimplePlayerState extends State\u003cSimplePlayer\u003e {\n  late BccmPlayerController playerController;\n\n  @override\n  void initState() {\n    // You can also use the global \"primary\" controller: BccmPlayerController.primary;\n    // The primary player has superpowers like notification player, background playback, casting, etc.\n    playerController = BccmPlayerController(\n      MediaItem(\n        url: 'https://devstreaming-cdn.apple.com/videos/streaming/examples/adv_dv_atmos/main.m3u8',\n        mimeType: 'application/x-mpegURL',\n        metadata: MediaMetadata(title: 'Apple advanced (HLS/HDR)'),\n      ),\n    );\n    playerController.initialize().then((_) =\u003e playerController.setMixWithOthers(true)); // if you want to play together with other videos\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    playerController.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return ListView(\n      children: [\n        Column(\n          children: [\n            BccmPlayerView(\n              playerController,\n              //config: BccmPlayerViewConfig()\n            ),\n            ElevatedButton(\n              onPressed: () {\n                playerController.setPrimary();\n              },\n              child: const Text('Make primary'),\n            ),\n            ElevatedButton(\n              onPressed: () {\n                final currentMs = playerController.value.playbackPositionMs;\n                if (currentMs != null) {\n                  playerController.seekTo(Duration(milliseconds: currentMs + 20000));\n                }\n              },\n              child: const Text('Skip 20 seconds'),\n            ),\n          ],\n        ),\n      ],\n    );\n  }\n}\n\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbcc-code%2Fbccm-player","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbcc-code%2Fbccm-player","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbcc-code%2Fbccm-player/lists"}