50 lines
1.8 KiB
Swift
50 lines
1.8 KiB
Swift
|
import Foundation
|
||
|
import AVFoundation
|
||
|
import AVKit
|
||
|
|
||
|
/*!
|
||
|
* Collection of helper functions for tvOS specific features
|
||
|
*/
|
||
|
|
||
|
#if os(tvOS)
|
||
|
enum RCTVideoTVUtils {
|
||
|
static func makeNavigationMarkerGroups(_ chapters: [Chapter]) -> [AVNavigationMarkersGroup] {
|
||
|
var metadataGroups = [AVTimedMetadataGroup]()
|
||
|
|
||
|
// Iterate over the defined chapters and build a timed metadata group object for each.
|
||
|
chapters.forEach { chapter in
|
||
|
metadataGroups.append(makeTimedMetadataGroup(for: chapter))
|
||
|
}
|
||
|
|
||
|
return [AVNavigationMarkersGroup(title: nil, timedNavigationMarkers: metadataGroups)]
|
||
|
}
|
||
|
|
||
|
static func makeTimedMetadataGroup(for chapter: Chapter) -> AVTimedMetadataGroup {
|
||
|
var metadata = [AVMetadataItem]()
|
||
|
|
||
|
// Create a metadata item that contains the chapter title.
|
||
|
let titleItem = RCTVideoUtils.createMetadataItem(for: .commonIdentifierTitle, value: chapter.title)
|
||
|
metadata.append(titleItem)
|
||
|
|
||
|
// Create a time range for the metadata group.
|
||
|
let timescale: Int32 = 600
|
||
|
let startTime = CMTime(seconds: chapter.startTime, preferredTimescale: timescale)
|
||
|
let endTime = CMTime(seconds: chapter.endTime, preferredTimescale: timescale)
|
||
|
let timeRange = CMTimeRangeFromTimeToTime(start: startTime, end: endTime)
|
||
|
|
||
|
// Image
|
||
|
if let imgUri = chapter.uri,
|
||
|
let uri = URL(string: imgUri),
|
||
|
let imgData = try? Data(contentsOf: uri),
|
||
|
let image = UIImage(data: imgData),
|
||
|
let pngData = image.pngData()
|
||
|
{
|
||
|
let imageItem = RCTVideoUtils.createMetadataItem(for: .commonIdentifierArtwork, value: pngData)
|
||
|
metadata.append(imageItem)
|
||
|
}
|
||
|
|
||
|
return AVTimedMetadataGroup(items: metadata, timeRange: timeRange)
|
||
|
}
|
||
|
}
|
||
|
#endif
|