MobilePlayer - A powerful and completely customizable media player for iOS

Overview

logo

MobilePlayer CocoaPods

codebeat badge CocoaPods Carthage compatible Dependencies StackOverflow Join the chat at https://gitter.im/mobileplayer/mobileplayer-ios

A powerful and completely customizable media player for iOS.

Table of Contents

  1. Features
  2. Installation
  3. Usage
  4. Customization
  1. Examples
  2. Documentation
  3. License

Features

  • Branding
    • Flexible skinning. Add a watermark, add/remove/move/resize interface elements, change their appearances and much more.
    • Easily set up A/B tests. You can manage multiple player skins and configurations. Player view controllers can load configuration data from a local JSON file or remote JSON data. You also have the option to initialize and pass configuration objects programmatically, which allows for greater flexibility.
  • Engagement
    • Comes with a built-in share button.
    • Standard sharing behavior can easily be modified.
    • Show any view controller as pre-roll or post-roll content.
    • Powerful overlay system. Add any view controller as an overlay to your video. Make them permanently visible, set them to appear in defined playback time intervals, or while playback is paused.
  • 100% documented.

Future plans

  • Well defined and extensive NSNotifications.
  • Volume button and volume slider elements.
  • Airplay support.
  • Plugin support.
  • Pre-bundled analytics plugins for various platforms.
  • VAST support.
  • Monetization.

Installation

CocoaPods

Add the following line in your Podfile.

pod "MobilePlayer"

Carthage

Add the following line to your Cartfile.

github "mobileplayer/mobileplayer-ios"

Usage

import MobilePlayer

let playerVC = MobilePlayerViewController(contentURL: videoURL)
playerVC.title = "Vanilla Player - \(videoTitle)"
playerVC.activityItems = [videoURL] // Check the documentation for more information.
presentMoviePlayerViewControllerAnimated(playerVC)

example-plain

Customization

Initialize using local configuration file

let bundle = NSBundle.mainBundle()
let config = MobilePlayerConfig(fileURL: bundle.URLForResource(
  "WatermarkedPlayer",
  withExtension: "json")!)
let playerVC = MobilePlayerViewController(
  contentURL: videoURL,
  config: config)
playerVC.title = "Watermarked Player - \(videoTitle)"
playerVC.activityItems = [videoURL]
present(playerVC, animated: true, completion: nil)

Initialize using remote configuration data

guard let configURL = NSURL(string: "https://goo.gl/c73ANK") else { return }
let playerVC = MobilePlayerViewController(
  contentURL: videoURL,
  config: MobilePlayerConfig(fileURL: configURL))
playerVC.title = "Watermarked Player - \(videoTitle)"
playerVC.activityItems = [videoURL]
present(playerVC, animated: true, completion: nil)

Configuration data

{
  "watermark": {
    "image": "MovielalaLogo"
  }
}

Without a configuration file URL

let playerVC = MobilePlayerViewController(
  contentURL: videoURL,
  config: MobilePlayerConfig(
    dictionary: ["watermark": ["image": "MovielalaLogo"]]))
playerVC.title = "Watermarked Player - \(videoTitle)"
playerVC.activityItems = [videoURL]
present(playerVC, animated: true, completion: nil)

Result example-customization

Skinning

{
  "watermark": {
    "image": "MovielalaLogo",
    "position": "topRight"
  },
  "topBar": {
    "backgroundColor": ["#a60500b0", "#a60500a0"],
    "elements": [
      {
        "type": "button",
        "identifier": "close"
      },
      {
        "type": "slider",
        "identifier": "playback",
        "trackHeight": 6,
        "trackCornerRadius": 3,
        "minimumTrackTintColor": "#eee",
        "availableTrackTintColor": "#9e9b9a",
        "maximumTrackTintColor": "#cccccc",
        "thumbTintColor": "#f9f9f9",
        "thumbBorderWidth": 1,
        "thumbBorderColor": "#fff",
        "marginRight": 4
      }
    ]
  },
  "bottomBar": {
    "backgroundColor": ["#a60500a0", "#a60500b0"],
    "elements": [
      {
        "type": "label",
        "text": "Now Watching",
        "font": "Baskerville",
        "size": 12,
        "marginLeft": 8,
        "marginRight": 8
      },
      {
        "type": "label",
        "identifier": "title",
        "size": 14
      },
      {
        "type": "button",
        "identifier": "action"
      },
      {
        "type": "toggleButton",
        "identifier": "play"
      }
    ]
  }
}

For all available identifiers, check the documentation or here. Same identifier value shouldn't be used more than once in a single configuration.

Result example-skinning

Example designs example-design-skinning

Showing overlays

let playerVC = MobilePlayerViewController(contentURL: videoURL)
playerVC.title = videoTitle
playerVC.activityItems = [videoURL]
present(playerVC, animated: true, completion: nil)
ProductStore.getProduct("1", success: { product in
  guard let product = product else { return }
  playerVC.showOverlayViewController(
    BuyOverlayViewController(product: product))
})

example-overlay

Showing timed overlays

let playerVC = MobilePlayerViewController(contentURL: videoURL)
playerVC.title = videoTitle
playerVC.activityItems = [videoURL]
present(playerVC, animated: true, completion: nil)
ProductStore.getProductPlacementsForVideo(
  videoID,
  success: { productPlacements in
    guard let productPlacements = productPlacements else { return }
    for placement in productPlacements {
      ProductStore.getProduct(placement.productID, success: { product in
        guard let product = product else { return }
        playerVC.showOverlayViewController(
          BuyOverlayViewController(product: product),
          startingAtTime: placement.startTime,
          forDuration: placement.duration)
      })
    }
})

example-timed-overlays

Pre-roll

let playerVC = MobilePlayerViewController(
  contentURL: videoURL,
  prerollViewController: PrerollOverlayViewController())
playerVC.title = videoTitle
playerVC.activityItems = [videoURL]
present(playerVC, animated: true, completion: nil)

example-preroll

Pause overlay

let playerVC = MobilePlayerViewController(
  contentURL: videoURL,
  pauseOverlayViewController: PauseOverlayViewController())
playerVC.title = videoTitle
playerVC.activityItems = [videoURL]
present(playerVC, animated: true, completion: nil)

Result example-pause-overlay

Example designs example-design-pause-overlay

Post-roll

let playerVC = MobilePlayerViewController(
  contentURL: videoURL,
  postrollViewController: PostrollOverlayViewController())
playerVC.title = videoTitle
playerVC.activityItems = [videoURL]
present(playerVC, animated: true, completion: nil)

Result example-postroll

Example designs example-design-postroll

Examples

After cloning the repo, run the MobilePlayerExamples target to see examples for many use cases. examples

Documentation

The entire documentation for the library can be found here.

License

The use of the MobilePlayer open source edition is governed by a Creative Commons license. You can use, modify, copy, and distribute this edition as long as it’s for non-commercial use, you provide attribution, and share under a similar license. http://mobileplayer.io/license/

Comments
  • Swift 3 compatibility

    Swift 3 compatibility

    Hello, thanks for your amazing work.

    Do you know when it will be Swift 3 ready?

    If you create a "swift3" branch, maybe I can take some time to submit a PR.

    opened by Tulleb 5
  • How to Remove Share Button

    How to Remove Share Button

    ℹ Please fill out this template when filing an issue. All lines beginning with an ℹ symbol instruct you with what info we expect.
    Please remove this line and all above before submitting.

    Report

    What did you do?

    ℹ Please replace this with what you did.

    What did you expect to happen?

    ℹ Please replace this with what you expected to happen.

    What happened instead?

    ℹ Please replace this with of what happened instead.

    Project that demonstrates the issue

    ℹ Please link to a project we can download that reproduces the issue.

    opened by zeeshanbiit 4
  • Build failed

    Build failed

    Not sure this is an issue with Carthage, but when building this with Carthage I get an error. Trying to build it with Xcode 8 swift 3.0

    *** Fetching mobileplayer-ios *** Checking out mobileplayer-ios *** xcodebuild output can be found in /var/folders/y5/xhb7djqj5kdgymjjvt30g_mw0000gn/T/carthage-xcodebuild.kDlCJr.log *** Building scheme "MobilePlayerExampleStores" in MobilePlayer.xcodeproj ** CLEAN FAILED **

    The following build commands failed: Check dependencies (1 failure) ** BUILD FAILED **

    The following build commands failed: Check dependencies (1 failure) A shell task (/usr/bin/xcrun xcodebuild -project /Users/max/Documents/xcode-projects/Sylabus1x/Carthage/Checkouts/mobileplayer-ios/MobilePlayer.xcodeproj -scheme MobilePlayerExampleStores -configuration Release -sdk iphoneos ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES clean build) failed with exit code 65: ** CLEAN FAILED **

    opened by rezasham 4
  • Player isn't working unless in fullscreen mode + events questions

    Player isn't working unless in fullscreen mode + events questions

    @sahin

    Hi.. I'm trying to implement the mobileios and I've been running in some issues. When I try to put the player in a "subview" it doesn't receive any user input ( I just can't pause/play or do any of the actions ). Here's my code:

            let videoURL = NSURL(string: url)!
            let player = MobilePlayerViewController(contentURL: videoURL,
                config: MobilePlayerConfig(fileURL: NSBundle.mainBundle().URLForResource("PlayerSkin", withExtension: "json")!))
    
            player.title = media.title
            player.activityItems = [videoURL]
            player.view.frame = CGRect(x: 30, y: 25, width: 640, height: 360)
    
            container.addSubview(player.view) //container is a UIView inside my main controller
    

    captura de tela 2016-03-14 as 15 12 44

    Another question: how can I listen to the player events? Like "onPlay", "onPause", "onProgress" and so on?

    Thanks

    opened by ThiagoMiranda 4
  • Swift 4.2 compatibly

    Swift 4.2 compatibly

    Report

    What did you do?

    Trying installing mobileplayer using cocoapods on Xcode 10.1 with swift 4.2

    What did you expect to happen?

    Install without issues

    What happened instead?

    language compatibility issues

    Screenshot

    screen shot 2018-12-27 at 20 59 19
    opened by MaorS 3
  • Allow rotation only in movie player

    Allow rotation only in movie player

    I've a portrait only app but I want to allow rotation inside movie player. Is it possible?

    I've tried using this small hack:

    let value = UIInterfaceOrientation.Portrait.rawValue
    UIDevice.currentDevice().setValue(value, forKey: "orientation")
    

    in viewWillAppear on the presenter view. It works but I see the rotation animation once movie player is dismissed.

    Is there any way to allow rotation only inside movie player and once close is pressed rotation is always portrait without any animations?

    opened by bitomule 3
  • Is it possible to add custom headers to request that fetch data?

    Is it possible to add custom headers to request that fetch data?

    Hi to all,

    I am working on project where we need to add additional headers on each one of requests if we authorised. Is it possible to do it on current version?

    opened by Samback 3
  • Load Video (youtube Source) specified time | Save the

    Load Video (youtube Source) specified time | Save the "exit" time

    Is there a way to load a video with a specified time so it does not start at 0:00? Is there a way to save the "last played" time via the close: function? If not these would be great improvements :-)!

    opened by fboulegue 3
  • [MobilePlayerViewController] Hiding action button on initialization and presenting it when acitivityItems is set.

    [MobilePlayerViewController] Hiding action button on initialization and presenting it when acitivityItems is set.

    Fixes #120 and hides social action button on init and shows it when activityItems is set.

    getViewForElementWithIdentifier("action")?.hidden = true doesn't need to be used by the user.

    These examples will have the action button hidden.

    let playerVC = MobilePlayerViewController(contentURL: videoURL)
    playerVC.title = "Vanilla Player - \(videoTitle)"
    presentMoviePlayerViewControllerAnimated(playerVC)
    
    let playerVC = MobilePlayerViewController(contentURL: videoURL)
    playerVC.title = "Vanilla Player - \(videoTitle)"
    playerVC.activityItems = []
    presentMoviePlayerViewControllerAnimated(playerVC)
    

    This example will have the action button shown.

    let playerVC = MobilePlayerViewController(contentURL: videoURL)
    playerVC.title = "Vanilla Player - \(videoTitle)"
    playerVC.activityItems = [videoURL]
    presentMoviePlayerViewControllerAnimated(playerVC)
    

    Review on Reviewable

    opened by jacks205 3
  • YouTube Example

    YouTube Example

    I have looked all over and have not been able to find a working YouTube example. I know it must exist since #24 added this feature. If anybody could lend me some assistance on which direction to head, that would be greatly appreciated!

    question 
    opened by Daltron 3
  • Extensive examples

    Extensive examples

    • [x] Plain example
    • [x] Configuration example
    • [x] Remote configuration example
    • [x] Programmatic configuration example
    • [x] Advanced configuration example
    • [x] Overlay example
    • [x] Timed overlay example
    • [x] Pre-roll example
    • [x] Pause overlay example
    • [x] Post-roll example

    Closes #78

    Review on Reviewable

    opened by isair 3
  • Bump tzinfo from 1.2.5 to 1.2.10

    Bump tzinfo from 1.2.5 to 1.2.10

    Bumps tzinfo from 1.2.5 to 1.2.10.

    Release notes

    Sourced from tzinfo's releases.

    v1.2.10

    TZInfo v1.2.10 on RubyGems.org

    v1.2.9

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    TZInfo v1.2.9 on RubyGems.org

    v1.2.8

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    TZInfo v1.2.8 on RubyGems.org

    v1.2.7

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    TZInfo v1.2.7 on RubyGems.org

    v1.2.6

    • Timezone#strftime('%s', time) will now return the correct number of seconds since the epoch. #91.
    • Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant.
    • Fixed "SecurityError: Insecure operation - require" exceptions when loading data with recent Ruby releases in safe mode.
    • Fixed warnings when running on Ruby 2.7. #106 and #111.

    TZInfo v1.2.6 on RubyGems.org

    Changelog

    Sourced from tzinfo's changelog.

    Version 1.2.10 - 19-Jul-2022

    Version 1.2.9 - 16-Dec-2020

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    Version 1.2.8 - 8-Nov-2020

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    Version 1.2.7 - 2-Apr-2020

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    Version 1.2.6 - 24-Dec-2019

    • Timezone#strftime('%s', time) will now return the correct number of seconds since the epoch. #91.
    • Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant.
    • Fixed "SecurityError: Insecure operation - require" exceptions when loading data with recent Ruby releases in safe mode.
    • Fixed warnings when running on Ruby 2.7. #106 and #111.
    Commits
    • 0814dcd Fix the release date.
    • fd05e2a Preparing v1.2.10.
    • b98c32e Merge branch 'fix-directory-traversal-1.2' into 1.2
    • ac3ee68 Remove unnecessary escaping of + within regex character classes.
    • 9d49bf9 Fix relative path loading tests.
    • 394c381 Remove private_constant for consistency and compatibility.
    • 5e9f990 Exclude Arch Linux's SECURITY file from the time zone index.
    • 17fc9e1 Workaround for 'Permission denied - NUL' errors with JRuby on Windows.
    • 6bd7a51 Update copyright years.
    • 9905ca9 Fix directory traversal in Timezone.get when using Ruby data source
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump cocoapods-downloader from 1.2.2 to 1.6.3

    Bump cocoapods-downloader from 1.2.2 to 1.6.3

    Bumps cocoapods-downloader from 1.2.2 to 1.6.3.

    Release notes

    Sourced from cocoapods-downloader's releases.

    1.6.3

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1

    Enhancements
    • None.
    Bug Fixes
    • Fix "can't modify frozen string" errors when pods are integrated using the branch option
      buju77 #10920

    1.5.0

    ... (truncated)

    Changelog

    Sourced from cocoapods-downloader's changelog.

    1.6.3 (2022-04-01)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2 (2022-03-28)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1 (2022-03-23)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0 (2022-03-22)

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1 (2021-09-07)

    Enhancements
    • None.

    ... (truncated)

    Commits
    • c03e2ed Release 1.6.3
    • f75bccc Disable Bazaar tests due to macOS 12.3 not including python2
    • 52a0d54 Merge pull request #128 from CocoaPods/validate_before_dl
    • d27c983 Ensure that the git pre-processor doesn't accidentally bail also
    • 3adfe1f [CHANGELOG] Add empty Master section
    • 591167a Release 1.6.2
    • d2564c3 Merge pull request #127 from CocoaPods/validate_before_dl
    • 99fec61 Switches where we check for invalid input, to move it inside the download fun...
    • 96679f2 [CHANGELOG] Add empty Master section
    • 3a7c54b Release 1.6.1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump redcarpet from 3.4.0 to 3.5.1

    Bump redcarpet from 3.4.0 to 3.5.1

    Bumps redcarpet from 3.4.0 to 3.5.1.

    Release notes

    Sourced from redcarpet's releases.

    Redcarpet v3.5.1

    Fix a security vulnerability using :quote in combination with the :escape_html option.

    Reported by Johan Smits.

    v3.5.0

    This release mostly ships with bug fixes and tiny improvements.

    Improvements

    • Avoid mutating the options hash passed to a render object (See #663).

    • Automatically enable the fenced_code_blocks option passing a HTML_TOC object to the Markdown object's constructor since some languages rely on the sharp to comment code (See #451).

    • Remove the rel and rev attributes from the output generated for footnotes as they don't pass the HTML 5 validation (See #536).

    • Allow passing Range objects to the nesting_level option to have a higher level of customization for table of contents (See #519):

      Redcarpet::Render::HTML_TOC.new(nesting_level: 2..5)
      

    Bug fixes

    • Fix a segfault rendering quotes using StripDown and the :quote option.

    • Fix SmartyPants single quotes right after a link. For example:

      [John](http://john.doe)'s cat
      

      Will now properly converts ' to a right single quote (i.e. ).

    Changelog

    Sourced from redcarpet's changelog.

    Version 3.5.1 (Security)

    • Fix a security vulnerability using :quote in combination with the :escape_html option.

      Reported by Johan Smits.

    Version 3.5.0

    • Avoid mutating the options hash passed to a render object.

      Refs #663.

      Max Schwenk

    • Fix a segfault rendering quotes using StripDown and the :quote option.

      Fixes #639.

    • Fix warning: instance variable @options not initialized when running under verbose mode (-w, $VERBOSE = true).

    • Fix SmartyPants single quotes right after a link. For example:

      [John](http://john.doe)'s cat
      

      Will now properly converts ' to a right single quote (i.e. ).

      Fixes #624.

    • Remove the rel and rev attributes from the output generated for footnotes as they don't pass the HTML 5 validation.

      Fixes #536.

    • Automatically enable the fenced_code_blocks option passing a HTML_TOC object to the Markdown object's constructor since some languages rely on the sharp to comment code.

      Fixes #451.

    • Allow passing Range objects to the nesting_level option to have a higher level of customization for table of contents:

      Redcarpet::Render::HTML_TOC.new(nesting_level: 2..5)
      

    ... (truncated)

    Commits
    • a699c82 Fix a security issue using :quote with :escape_html
    • 6270d6b Redcarpet v3.5.0
    • 94f6e27 Tiny follow-up to #663
    • 3100f65 Merge pull request #663 from maschwenk/dont-mutate-options
    • fc52d9c Add regression test
    • 03e7997 Don't mutated passed options
    • 92a7b3a Fix a segfault with StripDown and the :quote option
    • 7352162 Merge pull request #649 from rbalint/master
    • e23383e Merge pull request #650 from kolen/fix-warning-options-not-initialized
    • 6b86656 Fix "instance variable @options not initialized" warning
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • How to create custom view on video player

    How to create custom view on video player

    I am making video player in swift. I add some custom buttons and functionality for standard video player: 1. Playing video from URL (server) 2. Showing indicator while loading video like in VK 3. Add custom buttons to control (stop, pause buttons) and its working fine. I'm trying to implement custom view on player like below screen shot and play in custom duration in loop.

    I need this type of view on video player

    Screen Shot 1

    I can't understand how I can implement my tasks(For video url) there. Can you give some advice, which is the better way to do this?

    opened by shamdass 0
  • does support play webm、3gp 、oog format ?

    does support play webm、3gp 、oog format ?

    ℹ Please fill out this template when filing an issue. All lines beginning with an ℹ symbol instruct you with what info we expect.
    Please remove this line and all above before submitting.

    Report

    What did you do?

    ℹ Please replace this with what you did.

    What did you expect to happen?

    ℹ Please replace this with what you expected to happen.

    What happened instead?

    ℹ Please replace this with of what happened instead.

    Project that demonstrates the issue

    ℹ Please link to a project we can download that reproduces the issue.

    opened by jack1205 0
Releases(1.2.0)
Owner
Sahin Boydas
CEO & Founder of RemoteTeam.com
Sahin Boydas
▶️ video player in Swift, simple way to play and stream media on iOS/tvOS

Player Player is a simple iOS video player library written in Swift. Looking for an obj-c video player? Check out PBJVideoPlayer (obj-c). Looking for

patrick piemonte 2k Jan 2, 2023
An advanced media player library, simple and reliable

About The SRG Media Player library provides a simple way to add universal audio / video playback support to any application. It provides: A controller

SRG SSR 144 Jul 22, 2022
VLC media player

VLC media player VLC is a libre and open source media player and multimedia engine, focused on playing everything, and running everywhere. VLC can pla

VideoLAN 10.1k Dec 24, 2022
Musical Player - A Simple Musical Player For iOS

Musical_Player The app is a musical player. It was written as an task for a mobi

null 1 Nov 26, 2022
NextLevelSessionExporter is an export and transcode media library for iOS written in Swift.

NextLevelSessionExporter ?? NextLevelSessionExporter is an export and transcode media library for iOS written in Swift. The library provides customiza

NextLevel 233 Nov 27, 2022
Yattee: video player for Invidious and Piped built for iOS 15, tvOS 15 and macOS Monterey

Video player with support for Invidious and Piped instances built for iOS 15, tvOS 15 and macOS Monterey.

Yattee 1k Dec 27, 2022
Yattee: video player for Invidious and Piped built for iOS, tvOS and macOS

Video player for Invidious and Piped instances built for iOS, tvOS and macOS. Features Native user interface built with SwiftUI Multiple instances and

Yattee 1.1k Jan 8, 2023
MMPlayerView - Custom AVPlayerLayer on view and transition player with good effect like youtube and facebook

MMPlayerView Demo-Swift List / Shrink / Transition / Landscape MMPlayerLayer ex. use when change player view frequently like tableView / collectionVie

Millman Yang 724 Nov 24, 2022
iOS video player for trailer. You can customize layout for the control panel. Support PiP and DRM.

iOS video player for trailer. You can customize layout for the control panel. Support PiP and DRM.

Abe Wang 11 Nov 7, 2022
YouTube video player for iOS, tvOS and macOS

About XCDYouTubeKit is a YouTube video player for iOS, tvOS and macOS. Are you enjoying XCDYouTubeKit? You can say thank you with a tweet. I am also a

Cédric Luthi 2.9k Jan 7, 2023
Versatile Video Player implementation for iOS, macOS, and tvOS

News ?? - Since 2.1.3 VersaPlayer now supports iOS, macOS, and tvOS Example Installation Usage Basic Usage Adding Controls Advanced Usage Encrypted Co

Jose Quintero 723 Dec 26, 2022
📽 A video player for SwiftUI, support for caching, preload and custom control view.

Features QuickStart Advances Installation Requirements License Demo Clone or download the project. In the terminal, run swift package resolve. Open Vi

Gesen 437 Jan 5, 2023
Support customization of any player SDK and control layer

Support customization of any player SDK and control layer

紫枫 6.9k Dec 30, 2022
YoutubeKit is a video player that fully supports Youtube IFrame API and YoutubeDataAPI for easily create a Youtube app

YoutubeKit YoutubeKit is a video player that fully supports Youtube IFrame API and YoutubeDataAPI to easily create Youtube applications. Important Ref

Ryo Ishikawa 555 Dec 28, 2022
Audio player demo based on Swift and SwiftUI, which can play local or network audio.

SwiftAudioDemo Audio player demo based on Swift and SwiftUI, which can play local or network audio. In this demo, I have made a radio player to play n

Jensen Zhang 6 Mar 13, 2022
WatchTube: a standalone WatchOS youtube player utilizing Download API for search data and video streaming

WatchTube is a standalone WatchOS youtube player utilizing Download API for sear

WatchTubeTeam 11 May 30, 2022
BMPlayer - A video player for iOS, based on AVPlayer, support the horizontal, vertical screen

A video player for iOS, based on AVPlayer, support the horizontal, vertical screen. support adjust volume, brightness and seek by slide, support subtitles.

Eliyar Eziz 1.8k Jan 4, 2023
Swifty360Player - iOS 360-degree video player streaming from an AVPlayer.

Swifty360Player iOS 360-degree video player streaming from an AVPlayer. Demo Requirements Swifty360Player Version Minimum iOS Target Swift Version 0.2

Abdullah Selek 148 Dec 18, 2022
VGPlayer - 📺 A simple iOS video player by Vein.

Swift developed based on AVPlayer iOS player,support horizontal gestures Fast forward, pause, vertical gestures Support brightness and volume adjustment, support full screen, adaptive screen rotation direction.

Wen Rong 399 Dec 23, 2022