EVPlayer - A customized UIView with AVPlayer

EVPlayer

EVPlayer is a customized UIView with AVPlayer, which makes video playback extremely easy with its various usage options

? Features

  • Autoplay mode
  • Loop mode
  • Switch to full-screen mode synchronously
  • Seek animations
  • Double tap seek opportunity
  • Persistence player to resume playback after bad network connection
  • Get relevant player states (quickPlay, play, pause, thumbnail, restart, ended)
  • Thumbnail cover
  • Selectable supported orientations for full screen mode
  • Selectable seek durations for forward and backward (5, 10, 15, 30 seconds, …)
  • Get current & total time, loaded range and, full-screen mode life cycle
  • Interface unit tests available
  • Log available

Example

To run the example project, clone the repo, and run pod install from the Example directory first.

Requirements

  • iOS 12.0+

Installation

Using CocoaPods

CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:

$ gem install cocoapods

To integrate EVPlayer into your Xcode project using CocoaPods, specify it in your Podfile:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '12.0'
use_frameworks!

target '<Your Target Name>' do
    pod 'EVPlayer'
end

Then, run the following command:

$ pod install

Manual

Download the project, just drag and drop classes under Source file to your project.

▶️ Getting started

Create EVPlayer object

let evPlayer = EVPlayer(frame: CGRect(x: 0, y: 0, width: 350, height: 200))
view.addSubview(evPlayer)
evPlayer.center = view.center

Create media with video URL and optional thumbnail URL

let media = EVMedia(videoURL: URL, thumbnailURL: URL?)

Create configuration with media

let config = EVConfiguration(media: media)

Configuration can be customize

config.shouldAutoPlay = true
config.shouldLoopVideo = true
config.videoGravity = .resizeAspect
config.isFullScreenModeSupported = false
config.fullScreenVideoGravity = .resize
config.forwardSeekDuration = .k15
config.rewindSeekDuration = .k45
config.isFullScreenShouldOpenWithLandscapeMode = true
config.progressBarMaximumTrackTintColor = .blue
config.progressBarMinimumTrackTintColor = .green

Start loading operation with configuration

evPlayer.load(with: config)

EVPlayerController Usage

let config = EVConfiguration(media: media)
        
EVPlayerController.startFullScreenMode(withConfiguration: config)

?️ Customization

EVPlayer comes with several customizable features. You can customize these features on EVConfiguration file;

? shouldAutoPlay: Bool

  A Boolean value that determines whether the player should start playing automatically when the player is loaded.
  ⏯️ Default is NO

? shouldLoopVideo: Bool

  A Boolean value that determines whether the video should restart automatically from the beginning when it reaches the end.
  ⏯️ Default is NO

? videoGravity: AVLayerVideoGravity

  The gravity of the video layer that determines how the video is displayed within the layer bounds.
  ⏯️ Default is AVLayerVideoGravity.resize

? fullScreenModeVideoGravity: AVLayerVideoGravity

  The gravity of the full-screen mode video layer that determines how the video is displayed within the layer bounds.
  ⏯️ Default is AVLayerVideoGravity.resizeAspect

? isSeekAnimationsEnabled: Bool

  A Boolean value that determines whether seek animations should be enabled.
  ⏯️ Default is YES

? forwardSeekDuration: EVSeekDuration

  The time duration that the player should seek forward when the user taps the forward button.
  ⏯️ Default is k10 (10 seconds)

? rewindSeekDuration: EVSeekDuration

  The time duration that the player should seek rewind when the user taps the rewind button.
  ⏯️ Default is k10 (10 seconds)

? isFullScreenModeSupported: Bool

  A Boolean value that determines whether the full-screen mode supported.
  ⏯️ Default is YES

? isFullScreenShouldOpenWithLandscapeMode: Bool

  A Boolean value that determines whether the player should be presented in full-screen mode with landscape orientation.
  ⏯️ Default is NO, meaning the player will be presented in full-screen mode with portrait orientation.

? isFullScreenShouldAutoRotate: Bool

  A Boolean value that determines whether the player should rotate to match the device orientation when the device is rotated at full-screen mode.
  ⏯️ Default is YES

? fullScreenSupportedInterfaceOrientations: UIInterfaceOrientationMask

  The supported interface orientations for the player when it is presented in full-screen mode.
  ⏯️ Default is UIInterfaceOrientationMask.allButUpsideDown

? fullScreenPresentationStyle: UIModalPresentationStyle

  The presentation style to use when presenting the player in full-screen mode.
  ⏯️ Default is UIModalPresentationStyle.fullScreen

? thumbnailContentMode: UIView.ContentMode

  The content mode of thumbnail imageView.
  ⏯️ Default is UIView.ContentMode.scaleToFill

? progressBarMinimumTrackTintColor: UIColor

  The tint color of the minimum track of the progress bar, which represents the progress of the video playback.
  ⏯️ Default is UIColor.orange

? progressBarMaximumTrackTintColor: UIColor

  The tint color of the maximum track of the progress bar, which represents the remaining time of the video playback.
  ⏯️ Default is UIColor.lightGray with an alpha component of 0.8.

? isTransactionAnimated: Bool

  A Boolean value that determines whether the player transition to full-screen mode should be animated. 
  ⏯️ Default is YES

?️ Delegate

If you want to track current player state, current & total duration, and full screen lifecycle you can set delegate;

evPlayer.delegate = self

Methods;

func evPlayer(stateDidChangedTo state: EVVideoState)
func evPlayer(timeChangedTo currentTime: Double, totalTime: Double, loadedRange: Double)
func evPlayer(fullScreenTransactionUpdateTo state: EVFullScreenState)

??‍♂️ Author

Emirhan Saygıver

❓Questions or Advices

Just send me an email (saygivere@gmail.com)

? License

EVPlayer is available under the MIT license. See the LICENSE file for more info.

GitHub

View Github