ハイライト
アップルの場合
AVAssetDownloadTask単一の HLS メディア選択をダウンロードするには、次を使用します。AVAggregateAssetDownloadTask複数のオーディオと字幕の選択セットをダウンロードしてパスしますAVAssetCache、AVContentKeySessionそしてAVAssetDownloadStorageManagerオフライン再生、FairPlay キー、システム ストレージ管理を処理します。
主要内容
多くのビデオ アプリはすでにオンライン再生に HLS を使用しています。ユーザーは、飛行機に乗る前、外出する前、またはモバイルデータを消費したくないときに、同じコンテンツを事前に自分のデバイスにダウンロードしたいと思うでしょう。このセッションで Apple が示したアイデアは非常に単純です。AVFoundation を通じてダウンロードした後、同じ HLS リソースのセットをオンライン再生またはオフライン再生に使用できます。保護されたコンテンツは引き続き FairPlay ストリーミングを使用できます。
オフライン HLS のエントリ ポイントはダウンロード タスクです。それは実行されますURLSessionシステムでは、システム リソースとネットワークの状態に応じてタスクがスケジュールされます。ネットワーク環境が悪い場合、すぐに起動しない場合があります。 AVFoundation はタイムアウトが発生した場合に自動的に再試行します。アプリが行う必要があるのは、タスクの作成、進行状況の監視、ダウンロード場所の保存、そしてダウンロードしたリソースを使用してプレーヤー プロジェクトを作成することです。
ダウンロード戦略は 2 つあります。AVAssetDownloadTaskビデオ、オーディオ、字幕の組み合わせのセットをダウンロードするのに最適で、デバイスの地域とローカリゼーション設定に基づいてメディアの選択が自動的に選択されます。AVAggregateAssetDownloadTask英語の音声トラック、スペイン語の音声トラック、フランス語の字幕など、複数の音声と字幕のセットをユーザーが明示的に選択してオフラインでまとめて保存できるようにするのに最適です。進捗状況の統計も複雑になります。講演では、映像、音声、字幕を重みに応じて分割し、推定することを推奨している。この例では、ビデオがダウンロード時間の約 70% を占めています。
ダウンロードしたら、再生時にパスのセットを再作成する必要はありません。ダウンロードの進行中は、タスクの作成時に使用した設定を再利用できます。AVAssetにより、AVFoundation が再生とダウンロードの間でリソースを共有できるようになります。ダウンロードの完了後、元のタスク オブジェクトがメモリ内にない場合は、保存されたファイル URL を使用して再作成します。AVURLAsset。AVAssetCache現在のアセットがオフラインで再生できるかどうか、およびどのメディアの選択がオフラインで再生できるかについて答える責任があります。
保護されたコンテンツのキーはオフライン キーです。オンラインでプレイする場合、プレーヤーはオンデマンドでキー サーバーに接続できます。オフラインでプレイする場合、デバイスにネットワークがない可能性があるため、アプリはAVContentKeySessionオフラインキーを生成して保存します。キーサーバーは有効期限を設定できます。ユーザーがダウンロードを削除すると、アプリは対応する永続化可能なコンテンツ キーも積極的に無効にする必要があります。
iOS 14 のアップデートはエクスペリエンスとガバナンスに重点を置いています。ダウンロードの品質は、最小ビットレート、最小表示サイズ、HDR 設定、およびマルチチャンネル オーディオ設定によって制御できます。ストレージ管理は任せられるAVAssetDownloadStorageManagerこれにより、システムが有効期限と優先度に従ってオフライン メディアをクリーンアップできるようになり、ユーザーがシステム設定でこれらのコンテンツを削除できるようになります。
詳細
HLS ダウンロード タスクの単一グループを作成する
(02:52)AVAssetDownloadTaskビデオ、オーディオ、字幕の組み合わせのセットをダウンロードします。タスクを作成する前に、HLS URL を使用してタスクを作成しますAVURLAsset、次に背景を使用しますURLSessionConfiguration作成するAVAssetDownloadURLSession。例を渡しますAVAssetDownloadTaskMinimumRequiredMediaBitrateKey2 Mbps のダウンロード バージョンをリクエストします。
let hlsAsset = AVURLAsset(url: assetURL)
let backgroundConfiguration = URLSessionConfiguration.background(
withIdentifier: "assetDownloadConfigurationIdentifier")
let assetURLSession = AVAssetDownloadURLSession(configuration: backgroundConfiguration,
assetDownloadDelegate: self, delegateQueue: OperationQueue.main())
// Download a Movie at 2 mbps
let assetDownloadTask = assetURLSession.makeAssetDownloadTask(asset: hlsAsset,
assetTitle: "My Movie", assetArtworkData: myAssetArtwork,
options: [AVAssetDownloadTaskMinimumRequiredMediaBitrateKey: 2000000])!
assetDownloadTask.resume()
// AVAssetDownloadTask uses automatic media selection
キーポイント:
AVURLAsset(url:)元の HLS マスター プレイリストをポイントすると、このアセットを中心にダウンロードと再生が行われます。- バックグラウンド構成により、アプリがバックグラウンドに入った後もダウンロード タスクを実行し続けることができます。
AVAssetDownloadURLSession使用AVAssetDownloadDelegateコールバックのダウンロード ステータス。makeAssetDownloadTask単一のメディア選択に対するダウンロード タスクを作成します。AVAssetDownloadTaskMinimumRequiredMediaBitrateKeyダウンロードされたバージョンの最小ビットレートを制限するために使用されます。AVAssetDownloadTask自動メディア選択では、地域およびローカリゼーションの設定に基づいて音声と字幕が選択されます。
単一のダウンロード タスクの進行状況を監視する
(03:41) ダウンロード進行状況コールバックは、バイト数ではなくメディア時間範囲を使用して表現されます。このようにして、進行状況はプレーヤー インターフェイスの期間の概念に近づきます。完了ステータスは合格ですdidCompleteWithError通知します。
// Monitor AVAssetDownloadTask
public protocol AVAssetDownloadDelegate: URLSessionTaskDelegate {
// Use to monitor progress
func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask,
didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue],
timeRangeExpectedToLoad: CMTimeRange)
// Listen for completion
func urlSession(_ session: URLSession, task: URLSessionTask,
didCompleteWithError error: Error?)
}
キーポイント:
didLoad timeRange今回ロードされたメディア時間範囲をコールバックします。loadedTimeRangesダウンロードが完了した時間範囲を要約します。timeRangeExpectedToLoadロードが予想される合計時間範囲です。パーセンテージの計算に適しています。didCompleteWithError正常に完了したことを示すだけでなく、ダウンロードが失敗したことを示すエラー メッセージも表示されます。
ユーザーが複数の音声と字幕のセットを選択できるようにする
(04:55) ユーザーが多言語のオーディオ トラックまたは字幕をダウンロードする必要がある場合は、まずアセットのメディア選択グループからターゲット オプションを選択します。スピーチ例 各選択肢を書きますmyMediaSelections、そしてそれを集約ダウンロードタスクに渡します。
let hlsAsset = AVURLAsset(url: assetURL)
let myMediaSelections = [] // audio media-selections followed by subtitle media-selections
guard hlsAsset.statusOfValue(forKey: "availableMediaCharacteristicsWithMediaSelectionOptions", error: nil)
== AVKeyValueStatus.loaded else { return }
let mediaCharacteristic = //AVMediaCharacteristic.audible or AVMediaCharacteristic.legible
let mediaSelectionGroup = hlsAsset.mediaSelectionGroup(forMediaCharacteristic: mediaCharacteristic)
if let options = mediaSelectionGroup?.options {
for option in options {
// chose your media selection option
if /* this is my option */ {
let mutableMediaSelection = hlsAsset.preferredMediaSelection.mutableCopy()
mutableMediaSelection.select(option, in: mediaSelectionGroup)
myMediaSelections.append(mutableMediaSelection)
}
}
}
キーポイント:
availableMediaCharacteristicsWithMediaSelectionOptionsオプションのオーディオと字幕を列挙する前にロードする必要があります。AVMediaCharacteristic.audibleオーディオに対応し、AVMediaCharacteristic.legible対応する字幕。mediaSelectionGroup(forMediaCharacteristic:)指定されたタイプのオプションのコレクションを取得します。mutableMediaSelection.selectユーザーが選択したオプションをメディア選択に書き込みます。myMediaSelections音声、字幕の順に複数のダウンロード対象をまとめることができます。
集約ダウンロードタスクを作成する
(05:11)AVAggregateAssetDownloadTask複数のメディア選択をダウンロードするために使用されます。それはまだ使用していますAVAssetDownloadURLSessionとの違いは、タスクの作成時にメディア選択配列が渡されることです。
let hlsAsset = AVURLAsset(url: assetURL)
let myMediaSelections = ...
let backgroundConfiguration = URLSessionConfiguration.background(
withIdentifier: "assetDownloadConfigurationIdentifier")
let assetURLSession = AVAssetDownloadURLSession(configuration: backgroundConfiguration,
assetDownloadDelegate: self, delegateQueue: OperationQueue.main())
// Download a Movie at 2 mbps
let aggDownloadTask = assetURLSession.aggregateAssetDownloadTask(with: hlsAsset,
mediaSelections: myMediaSelections,
assetTitle: "My Movie",
assetArtworkData: myAssetArtwork,
options:[AVAssetDownloadTaskMinimumRequiredMediaBitrateKey: 2000000])!
aggDownloadTask.resume()
キーポイント:
aggregateAssetDownloadTask同じ HLS アセットを複数のメディア選択セットにバインドします。assetTitleそしてassetArtworkDataこれは、システムがオフライン コンテンツを管理するときにユーザーに表示されます。- ビットレートオプションは引き続き合格します
AVAssetDownloadTaskMinimumRequiredMediaBitrateKey入ってくる。 - マルチオーディオ トラックおよびマルチ字幕のダウンロードの場合、進行状況 UI はメディアの選択によって個別に推定する必要があります。
バックグラウンドでのダウンロード タスクを再開する
(07:04) ダウンロード タスクはバックグラウンドで実行され続けます。アプリが再起動されたら、同じバックグラウンド構成識別子でセッションを作成し、getAllTasks既存のタスクを取得します。
// Restore Tasks on App Launch
class MyAppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let configuration = URLSessionConfiguration.background(withIdentifier:
"assetDownloadConfigurationIdentifier")
let session = URLSession(configuration: configuration)
session.getAllTasks { tasks in
for task in tasks {
if let assetDownloadTask = task as? AVAssetDownloadTask {
// restore progress indicators, state, etc...
}
}
}
}
}
キーポイント:
- 構成識別子は、ダウンロードタスクの作成時と同じである必要があります。
getAllTasks現在のセッションのタスクを返します。- 取得
AVAssetDownloadTaskその後、進行状況バー、ステータス、およびタスク管理インターフェイスを復元できます。 - トランスクリプトには、元のダウンロード タスクが次の場所から取得できることも記載されています。
AVAsset使い続けてください。
どのコンテンツをオフラインで再生できるかを決定する
(09:16) ダウンロードが完了すると、AVAssetCache現在のアセットをオフラインで再生できるかどうか、またどのメディアの選択がローカルですでに利用可能であるかをアプリに伝えます。
// What can I play offline?
public class AVURLAsset {
public var assetCache: AVAssetCache? { get }
}
public class AVAssetCache {
public var isPlayableOffline: Bool { get }
public func mediaSelectionOptions(in mediaSelectionGroup: AVMediaSelectionGroup)
-> [AVMediaSelectionOption]
}
キーポイント:
AVURLAsset.assetCacheオフラインプレイ可能状態への入り口です。isPlayableOfflineアセット全体をオフラインで再生できるかどうかを答えます。mediaSelectionOptions(in:)オフライン再生に使用できるメディア選択グループのオプションを返します。- これは、「オーディオ トラックがダウンロードされました」や「字幕がダウンロードされました」などのインターフェイスの状態を駆動するのに適しています。
期限切れのオフライン FairPlay キー
(11:33) オフライン HLS は引き続き FairPlay ストリーミングを使用できます。アプリはダウンロード段階でオフライン キーを作成して保存し、それを使用してオフライン再生中のキー要求に応答します。ユーザーがダウンロードを削除する場合、または事前に認証を取り消す必要がある場合は、AVContentKeySession対応するキーが無効です。
// Invalidate Offline Key
public class AVContentKeySession {
func invalidatePersistableContentKey(_ persistableContentKeyData: Data,
options: [AVContentKeySessionServerPlaybackContextOption : Any]? = nil,
completionHandler handler: @escaping (Data?, Error?) -> Void)
func invalidateAllPersistableContentKeys(forApp appIdentifier: Data,
options: [AVContentKeySessionServerPlaybackContextOption : Any]? = nil,
completionHandler handler: @escaping (Data?, Error?) -> Void)
}
キーポイント:
invalidatePersistableContentKey保存された単一のオフライン キーを無効にするために使用されます。invalidateAllPersistableContentKeysFairPlay ストリーミング アプリケーション証明書に対応するアプリ ID に従って、すべてのキーをクリアできます。- トランスクリプトの説明 キー サーバーは、オフライン キーの有効期限を設定できます。
- 開始された再生中にキーの有効期限が切れた場合、途中で突然停止することを避けるために、現在の再生は最後まで継続されます。
オフライン ダウンロードの品質を制御する
(13:54) ダウンロードが速くなると、通常は品質が低くなります。品質が高ければ高いほど、より多くの時間とスペースが必要になります。 Session では、高速ダウンロードと最高品質の 2 つのオプションをユーザーに提供し、次にダウンロード タスク オプションを使用して特定のバージョンを制限することを推奨しています。 iOS 14 では、ディスプレイ サイズと HDR 設定コントロールが追加されています。
// Quality Selection
public class AVAssetDownloadTask {
public let AVAssetDownloadTaskMinimumRequiredMediaBitrateKey: String
//Starting in iOS 14
public let AVAssetDownloadTaskMinimumRequiredPresentationSizeKey: String
public let AVAssetDownloadTaskPrefersHDRKey: String
}
キーポイント:
AVAssetDownloadTaskMinimumRequiredMediaBitrateKeyダウンロードしたバージョンを最低ビット レートでフィルタリングします。AVAssetDownloadTaskMinimumRequiredPresentationSizeKeyiOS 14 以降で利用可能になり、ディスプレイの寸法で質量を制限します。AVAssetDownloadTaskPrefersHDRKeyHDR プレゼンテーションを優先するかどうかを制御します。- トランスクリプトの説明 ダウンロード タスクでは、デフォルトで利用可能な HDR プレゼンテーションのダウンロードが優先されます。
オフライン コンテンツはシステム管理に任せる
(15:51) セッション オフライン ダウンロードはオペレーティング システムに管理させることをお勧めします。ストレージが不足している場合やソフトウェアの更新中に、システムはスペースを再利用でき、ユーザーはシステム設定でメディアを削除できます。アプリはストレージ マネージャーを通じて有効期限と優先度を設定します。
// AVAssetDownloadStorageManager
// Get the singleton
let storageManager = AVAssetDownloadStorageManager.shared()
// Create the policy
let newPolicy = AVMutableAssetDownloadStorageManagementPolicy()
newPolicy.expirationDate = myExpiryDate
newPolicy.priority = .important
// Set the policy
storageManager.setStorageManagementPolicy(newPolicy, forURL: myDownloadStorageURL)
キーポイント:
AVAssetDownloadStorageManager.shared()システムによって提供されるダウンロード ストレージ マネージャーを入手します。AVMutableAssetDownloadStorageManagementPolicyこのコンテンツのクリーニング戦略について説明してください。expirationDateまずは清掃と判定に参加し、priority次に、保持の優先順位を決定します。setStorageManagementPolicyコンテンツがダウンロードされるシステムの場所にポリシーを適用します。- トランスクリプト 特別な注意事項として、ダウンロードしたコンテンツはシステムが提供する場所に残しておき、システムがコンテンツを削除した後の状態に対処できるように準備してください。
重要ポイント
-
オフラインダウンロード前のバージョン選択ページ
-
対処法: ビデオの詳細ページに「高速ダウンロード」と「最高品質」の 2 つの入り口を用意し、予想される音声トラック、字幕、および画質のオプションを表示します。
-
実行する価値がある理由: セッションでは、ユーザーにダウンロード時間と品質のどちらかを選択させることを明示的に推奨しており、ダウンロード タスクではビットレート、表示サイズ、HDR、およびマルチチャンネルの設定も提供されます。
-
開始方法: を使用します
AVAssetDownloadTaskMinimumRequiredMediaBitrateKeyクイックバージョンを作成するには、次を使用しますAVAssetDownloadTaskMinimumRequiredPresentationSizeKeyそしてAVAssetDownloadTaskPrefersHDRKey高画質版を作ります。 -
多言語オフライン パッケージ
-
内容: ユーザーがダウンロードする前に、英語音声、スペイン語音声、フランス語字幕など、複数の音声トラックと字幕を選択できるようにします。
-
実行する価値がある理由:
AVAggregateAssetDownloadTask複数のメディア選択セットを一度にダウンロードして、単一タスクでの自動選択が不明瞭になる問題を解決できます。 -
開始方法: 読む
AVMediaCharacteristic.audibleそしてAVMediaCharacteristic.legibleユーザーオプションを組み立てるメディア選択グループmediaSelections。 -
ダウンロード回復センターを作成
-
内容: アプリの起動後にすべてのバックグラウンド HLS ダウンロード タスクを再開し、進行状況、ステータス、エラーを表示し続けます。
-
実行する価値がある理由: ダウンロード タスクはバックグラウンドで実行され続けるため、再起動時にタスクを取得するには同じセッション ID を使用する必要があります。
-
開始方法: アプリの起動時に同じ識別子でバックグラウンド セッションを作成し、呼び出します
getAllTasks、のためにAVAssetDownloadTaskUI の状態を復元します。 -
オフライン認証の有効期限のリマインダーを作成
-
対処方法: オフライン ビデオ リストに FairPlay オフライン キーの有効期限ステータスを表示し、インターネット接続時に有効期限が切れたキーを事前に更新します。
-
実行する価値がある理由: トランスクリプトの説明 キー サーバーはオフライン キーの有効期限を設定でき、アプリは有効期限が切れる前に新しいオフライン キーを作成する必要があります。
-
開始方法: オフライン キーを保存するときに認証の有効期間を記録し、アプリがフォアグラウンドに戻るかダウンロード ページに入ったときに期限切れが近づいているアイテムをスキャンします。
-
システム ストレージ ポリシー パネルの作成
-
対処方法: オフライン ビデオの有効期限と重要性を設定し、スペースが不足している場合にシステムがコンテンツをクリーンアップする可能性があることをユーザーに通知します。
-
実行する価値がある理由:
AVAssetDownloadStorageManagerシステムが有効期限と優先度に基づいてオフライン メディアをリサイクルできるようにし、ユーザーが設定でコンテンツを削除できるようにします。 -
開始方法: ダウンロード URL ごとに設定
AVMutableAssetDownloadStorageManagementPolicy、そして使用しますAVAssetCache.isPlayableOffline現地の状況を再確認します。
関連セッション
- AVAssetWriter を使用して断片化された MPEG-4 コンテンツを作成する — HLS 出力に適した断片化された MPEG-4 コンテンツを生成する方法を学びます。
- より優れた HLS オーディオ エクスペリエンスを提供する — HLS オーディオ エンコード、帯域幅に制約のあるネットワーク、マルチチャネル配信について学び続けます。
- HLS ツールによるストリーム オーサリングの改善 — HLS ツールを使用して、ライブ ストリームとオンデマンド ストリームのオーサリング品質をチェックします。
- 低遅延 HLS の新機能 - 同年の HLS プロトコルの更新と低遅延再生リンクについて理解します。
- 広告挿入を低遅延 HLS に適応させる — 低遅延 HLS で広告挿入とコンテンツ切り替えがどのように処理されるかを学びます。
コメント
GitHub Issues · utterances