Browse Source

Swift Video

master
marcoschmickler 4 years ago
parent
commit
a22bd602d7
  1. 4
      kplayer.xcodeproj/project.pbxproj
  2. 2
      kplayer/core/MediaItem.swift
  3. 28
      kplayer/detail/DetailViewController.swift
  4. 13
      kplayer/detail/VideoController.swift
  5. 23
      kplayer/svideo/SVideoModel.swift
  6. 62
      kplayer/svideo/SVideoPlayer.swift

4
kplayer.xcodeproj/project.pbxproj

@ -17,6 +17,7 @@
1C7361D3BA77C40275F89D4A /* TimelineMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7368C7B946BC9E067D37E7 /* TimelineMeasure.swift */; }; 1C7361D3BA77C40275F89D4A /* TimelineMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7368C7B946BC9E067D37E7 /* TimelineMeasure.swift */; };
1C7361F376DA11F17CD3250B /* TrimView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736ABA0E14A51ACAC84AB5 /* TrimView.swift */; }; 1C7361F376DA11F17CD3250B /* TrimView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736ABA0E14A51ACAC84AB5 /* TrimView.swift */; };
1C73631EACF56BABD3B2BCFB /* LayoutTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736BC4450890C45F8FBC63 /* LayoutTools.swift */; }; 1C73631EACF56BABD3B2BCFB /* LayoutTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736BC4450890C45F8FBC63 /* LayoutTools.swift */; };
1C73633AAF0D77F8AC3557B9 /* SVideoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7362603E8588B4D1A8C617 /* SVideoModel.swift */; };
1C73635138BBD2BB480A308F /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C736777456388CA571DA17B /* MediaPlayer.framework */; }; 1C73635138BBD2BB480A308F /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C736777456388CA571DA17B /* MediaPlayer.framework */; };
1C7363D4C34EBBD5C7AAD0A8 /* scratch.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1C7363E0DDA5854D55F8836E /* scratch.txt */; }; 1C7363D4C34EBBD5C7AAD0A8 /* scratch.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1C7363E0DDA5854D55F8836E /* scratch.txt */; };
1C73640D928DE56D35175D39 /* UploadOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736260E748CF136FF37EA7 /* UploadOperation.swift */; }; 1C73640D928DE56D35175D39 /* UploadOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736260E748CF136FF37EA7 /* UploadOperation.swift */; };
@ -101,6 +102,7 @@
1C73624617102E0DEB001C25 /* SVideoPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SVideoPlayer.swift; path = svideo/SVideoPlayer.swift; sourceTree = "<group>"; }; 1C73624617102E0DEB001C25 /* SVideoPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SVideoPlayer.swift; path = svideo/SVideoPlayer.swift; sourceTree = "<group>"; };
1C73625012D50E457D18A785 /* kplayer.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = kplayer.js; sourceTree = "<group>"; }; 1C73625012D50E457D18A785 /* kplayer.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = kplayer.js; sourceTree = "<group>"; };
1C736253AB7A95EA41B605B7 /* ItemModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemModel.swift; sourceTree = "<group>"; }; 1C736253AB7A95EA41B605B7 /* ItemModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemModel.swift; sourceTree = "<group>"; };
1C7362603E8588B4D1A8C617 /* SVideoModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SVideoModel.swift; path = svideo/SVideoModel.swift; sourceTree = "<group>"; };
1C736260E748CF136FF37EA7 /* UploadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadOperation.swift; sourceTree = "<group>"; }; 1C736260E748CF136FF37EA7 /* UploadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadOperation.swift; sourceTree = "<group>"; };
1C73631C96E6C860833052CA /* ItemType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemType.swift; sourceTree = "<group>"; }; 1C73631C96E6C860833052CA /* ItemType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemType.swift; sourceTree = "<group>"; };
1C736362946D7A8585B0D875 /* TimelineScroller.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TimelineScroller.swift; path = timeline/TimelineScroller.swift; sourceTree = "<group>"; }; 1C736362946D7A8585B0D875 /* TimelineScroller.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TimelineScroller.swift; path = timeline/TimelineScroller.swift; sourceTree = "<group>"; };
@ -341,6 +343,7 @@
1C73661561AD069C92FE3B15 /* TimelineView.swift */, 1C73661561AD069C92FE3B15 /* TimelineView.swift */,
1C736ABA0E14A51ACAC84AB5 /* TrimView.swift */, 1C736ABA0E14A51ACAC84AB5 /* TrimView.swift */,
1C73624617102E0DEB001C25 /* SVideoPlayer.swift */, 1C73624617102E0DEB001C25 /* SVideoPlayer.swift */,
1C7362603E8588B4D1A8C617 /* SVideoModel.swift */,
); );
path = kplayer; path = kplayer;
sourceTree = "<group>"; sourceTree = "<group>";
@ -592,6 +595,7 @@
1C736EC45EE7DA5F7FCE63DA /* LocalManager.swift in Sources */, 1C736EC45EE7DA5F7FCE63DA /* LocalManager.swift in Sources */,
1C736A78C1F8F41E2AEEF278 /* KVideoPlayer.swift in Sources */, 1C736A78C1F8F41E2AEEF278 /* KVideoPlayer.swift in Sources */,
1C736FF8FF423F01F880F94D /* SVideoPlayer.swift in Sources */, 1C736FF8FF423F01F880F94D /* SVideoPlayer.swift in Sources */,
1C73633AAF0D77F8AC3557B9 /* SVideoModel.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

2
kplayer/core/MediaItem.swift

@ -10,7 +10,7 @@ import Combine
/** /**
Repräsentiert ein Item eines der festgelegten Typen. Repräsentiert ein Item eines der festgelegten Typen.
*/ */
class MediaItem: CustomDebugStringConvertible, ObservableObject {
class MediaItem: CustomDebugStringConvertible, ObservableObject, Identifiable {
/** /**
Wird durch name, path und root identifiziert. Wird durch name, path und root identifiziert.

28
kplayer/detail/DetailViewController.swift

@ -31,7 +31,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
var showFavoritesOnly = false var showFavoritesOnly = false
var collectionView: UICollectionView! var collectionView: UICollectionView!
var videoplayer = false
var videoplayer = true
var currentItem: MediaItem? var currentItem: MediaItem?
@ -471,20 +471,22 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
var se = selectedItem var se = selectedItem
var children = detailItem!.children var children = detailItem!.children
if videoplayer { if videoplayer {
if selectedItem.local {
let jfile = selectedItem.playerURL!.appendingPathExtension("json")
do {
let jsonData = try Data(contentsOf: jfile)
let model = SVideoModel(allItems: children, currentSnapshot: se)
let items = try JSONDecoder().decode(MediaModel.self, from: jsonData)
se = MediaItem(model: items)
children = se.children
let player = SVideoPlayer(completionHandler: {
self.dismiss(animated: true, completion: nil);
}, model: model)
player
print (String(data: jsonData, encoding: .utf8))
} catch {
print(error)
}
}
let pc = UIHostingController(rootView: player)
pc.view.backgroundColor = .black
let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack.
navController.modalPresentationStyle = .fullScreen
navController.setNavigationBarHidden(true, animated: false)
present(navController, animated: false, completion: nil)
return
} }
var pc: VideoController var pc: VideoController

13
kplayer/detail/VideoController.swift

@ -29,7 +29,10 @@ protocol ItemController {
class VideoController: UIViewController, ItemController, BMPlayerDelegate, EditItemDelegate { class VideoController: UIViewController, ItemController, BMPlayerDelegate, EditItemDelegate {
var player = BMPlayer() var player = BMPlayer()
// played on startup
var currentItem: MediaItem? var currentItem: MediaItem?
var currentSnapshot: MediaItem? var currentSnapshot: MediaItem?
var allItems = [MediaItem]() var allItems = [MediaItem]()
var detailDelegate: DetailDelegate? var detailDelegate: DetailDelegate?
@ -148,16 +151,6 @@ class VideoController: UIViewController, ItemController, BMPlayerDelegate, EditI
make.right.equalToSuperview() make.right.equalToSuperview()
make.top.equalToSuperview() make.top.equalToSuperview()
} }
// player.controlView.topWrapperView.addSubview(hc!.view)
// player.controlView.setNeedsLayout()
// player.controlView.layoutIfNeeded()
// let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack.
// navController.modalPresentationStyle = .popover
// present(navController, animated: false, completion: nil)
} }
func captureZoom() { func captureZoom() {

23
kplayer/svideo/SVideoModel.swift

@ -0,0 +1,23 @@
//
// Created by Marco Schmickler on 28.11.21.
// Copyright (c) 2021 Marco Schmickler. All rights reserved.
//
import Foundation
import AVKit
class SVideoModel : ObservableObject {
var allItems : [MediaItem]
var currentSnapshot: MediaItem
init(allItems: [MediaItem], currentSnapshot: MediaItem) {
self.allItems = allItems
self.currentSnapshot = currentSnapshot
}
func currentPlayerItem() -> AVPlayerItem {
AVPlayerItem(asset: AVAsset(url: currentSnapshot.playerURL!))
}
}

62
kplayer/svideo/SVideoPlayer.swift

@ -0,0 +1,62 @@
//
// Created by Marco Schmickler on 15.11.21.
// Copyright (c) 2021 Marco Schmickler. All rights reserved.
//
import Foundation
import SwiftUI
import AVKit
struct SVideoPlayer : View {
// url: URL(string: "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8")!
var player = AVQueuePlayer(items: [AVPlayerItem]())
var completionHandler: (() -> Void)?
var model: SVideoModel
var body: some View {
HStack {
Button(action: {
completionHandler!()
}, label: {
Text("cancel")
}).buttonStyle(BorderlessButtonStyle());
ScrollView (.horizontal, showsIndicators: false) {
HStack {
ForEach(model.allItems) { item in
Button(action: {
}) {
if item.image != nil {
Image(uiImage: item.image!)
}
else {
Image("Kirschkeks-256x256.png")
}
}
}
}
}.frame(height: 100)
Spacer()
}
VideoPlayer(player: player)
.onAppear() {
player.removeAllItems()
player.insert(model.currentPlayerItem(), after: nil)
// Start the player going, otherwise controls don't appear
player.play()
}
.onDisappear() {
// Stop the player when the view disappears
player.pause()
}
}
}
struct SVideoPlayer_Previews: PreviewProvider {
static var previews: some View {
SVideoPlayer(model: SVideoModel(allItems: [MediaItem](), currentSnapshot: MediaItem(name: "extern", path: "", root: "", type: ItemType.FAVROOT)))
}
}
Loading…
Cancel
Save