From c123829952d81f5561bb165c63a7ed8a5226fec5 Mon Sep 17 00:00:00 2001 From: Martin Glass <@martinoneutrino> Date: Tue, 13 Mar 2018 20:52:00 -0600 Subject: [PATCH] Add MediaTimeRangesType for playback skip or other function --- TVMediaPlayer.xcodeproj/project.pbxproj | 4 ++++ TVMediaPlayer/MediaTimeRangesType.swift | 26 ++++++++++++++++++++++ TVMediaPlayerTestApp/TestMediaPlayer.swift | 16 ++++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 TVMediaPlayer/MediaTimeRangesType.swift diff --git a/TVMediaPlayer.xcodeproj/project.pbxproj b/TVMediaPlayer.xcodeproj/project.pbxproj index 726ee6b..71b24df 100644 --- a/TVMediaPlayer.xcodeproj/project.pbxproj +++ b/TVMediaPlayer.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 5BFF05C52058B4EB00A21C94 /* MediaTimeRangesType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BFF05C42058B4EB00A21C94 /* MediaTimeRangesType.swift */; }; 711F134E1C40F7ED0096DBAD /* TVMediaPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 711F134D1C40F7ED0096DBAD /* TVMediaPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 711F135A1C40F9560096DBAD /* ControlsOverlay.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 711F13551C40F9560096DBAD /* ControlsOverlay.storyboard */; }; 711F135B1C40F9560096DBAD /* ControlsOverlayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 711F13561C40F9560096DBAD /* ControlsOverlayViewController.swift */; }; @@ -52,6 +53,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 5BFF05C42058B4EB00A21C94 /* MediaTimeRangesType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaTimeRangesType.swift; sourceTree = ""; }; 711F134A1C40F7ED0096DBAD /* TVMediaPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TVMediaPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 711F134D1C40F7ED0096DBAD /* TVMediaPlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TVMediaPlayer.h; sourceTree = ""; }; 711F134F1C40F7ED0096DBAD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -123,6 +125,7 @@ 711F13571C40F9560096DBAD /* MediaPlayerViewController.swift */, 711F13581C40F9560096DBAD /* MediaItemType.swift */, 711F13591C40F9560096DBAD /* MediaPlayerType.swift */, + 5BFF05C42058B4EB00A21C94 /* MediaTimeRangesType.swift */, 711F134D1C40F7ED0096DBAD /* TVMediaPlayer.h */, 711F134F1C40F7ED0096DBAD /* Info.plist */, 711F13651C41C2900096DBAD /* Images.xcassets */, @@ -263,6 +266,7 @@ 711F135D1C40F9560096DBAD /* MediaItemType.swift in Sources */, 711F135C1C40F9560096DBAD /* MediaPlayerViewController.swift in Sources */, 711F135B1C40F9560096DBAD /* ControlsOverlayViewController.swift in Sources */, + 5BFF05C52058B4EB00A21C94 /* MediaTimeRangesType.swift in Sources */, 711F135E1C40F9560096DBAD /* MediaPlayerType.swift in Sources */, 711F136A1C41C64D0096DBAD /* PlayerState.swift in Sources */, 711F13691C41C64D0096DBAD /* DPadState.swift in Sources */, diff --git a/TVMediaPlayer/MediaTimeRangesType.swift b/TVMediaPlayer/MediaTimeRangesType.swift new file mode 100644 index 0000000..545e643 --- /dev/null +++ b/TVMediaPlayer/MediaTimeRangesType.swift @@ -0,0 +1,26 @@ +import Foundation +import CoreMedia + +public protocol MediaTimeRangesType { + + func containsTime(_ time: CMTime) -> CMTimeRange? + + /// The list of ranges + var ranges:[CMTimeRange] { get } +} + +public extension MediaTimeRangesType { + func containsTime(_ time: CMTime) -> CMTimeRange? { + for range in ranges { + if (range.containsTime(time)) { + return range + } + } + return nil + } +} + +// +// Created by Martin Glass on 13-Mar-18. +// Copyright © 2018 SwiftBit. All rights reserved. +// diff --git a/TVMediaPlayerTestApp/TestMediaPlayer.swift b/TVMediaPlayerTestApp/TestMediaPlayer.swift index 0089321..1277db4 100644 --- a/TVMediaPlayerTestApp/TestMediaPlayer.swift +++ b/TVMediaPlayerTestApp/TestMediaPlayer.swift @@ -2,7 +2,7 @@ import Foundation import TVMediaPlayer import AVFoundation -class TestMediaPlayer: MediaPlayerType, MediaItemType { +class TestMediaPlayer: MediaPlayerType, MediaItemType, MediaTimeRangesType { lazy var playerItem:AVPlayerItem = { let url = URL(string: "https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4")! @@ -16,6 +16,14 @@ class TestMediaPlayer: MediaPlayerType, MediaItemType { let position = time.seconds / sself.length sself.positionChanged?(Float(position)) } + // skip + player.addPeriodicTimeObserver(forInterval: CMTime(value: 1, timescale: 1), queue: nil) { [weak self] time in + guard let sself = self else { return } + guard let timeRange = sself.containsTime(time) else { return } + player.seek(to: timeRange.end) + let position = timeRange.end.seconds / sself.length + sself.positionChanged?(Float(position)) + } return player }() @@ -61,6 +69,12 @@ class TestMediaPlayer: MediaPlayerType, MediaItemType { var subtitle:String? { return "Subtitle" } var length:Double { return playerItem.duration.seconds } + + //test range + var ranges:[CMTimeRange] { + return [CMTimeRange(start:CMTime(seconds:5.000, preferredTimescale:1000), + end:CMTime(seconds:9.000, preferredTimescale:1000))] + } } //