問題タブ [avurlasset]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
avfoundation - このビデオ プレーヤーの AVFoundation KVO パターン [参照: AVPlayerLayer、AVPlayerItem、AVURLAsset] の何が問題になっていますか?
AVFoundation のビデオ再生をカプセル化するために、UIView サブクラス「VideoPlayerView」を作成しました。AVPlayer、AVPlayerItems、および AVURLAssets の読み込み、再生、およびエラー処理の監視を処理するために、防弾 KVO パターンをセットアップしたと思います。
代わりに、このパターンが防御するために特別に設定されたというクラッシュが報告されているのを見つけました (めったにありませんが、それでも報告されています)。
a) クラス AVPlayerItem のインスタンス 0x170019730 の割り当てが解除されましたが、キー値オブザーバーがまだ登録されていました。
b) [VideoPlayerView setPlayerItem:] オブザーバーとして登録されていないため、AVPlayerItem からキー パス "status" のオブザーバー VideoPlayerView を削除できません。
c) [VideoPlayerView setAsset:] オブザーバーとして登録されていないため、AVURLAsset 0x170233780 からキー パス「再生可能」のオブザーバー VideoPlayerView 0x145e3bbd0 を削除できません。
なぜこれらのエラーが発生するのか、何を見逃していたのか、何を誤解していたのか、そして物事をより堅牢にする方法を学びたいと思います。
説明のために特定の詳細は簡略化されていますが、関連する情報はすべてここにあると思います。
クラス VideoPlayerView があり、これらのプロパティをとりわけ保持しています。
すべての参照は強力であることに注意してください。これらのオブジェクトは、VideoPlayerView (監視を行っている) 自体の割り当てが解除されるまで、割り当てを解除できません。 AVPlayerLayer は、その AVPlayer プロパティへの強力な参照を維持します。
次のようにカスタムゲッターを実装します。
次のようにカスタム セッターを実装します。
これらのカスタム セッター以外では、VideoPlayerView は常に "self.property =" または "[self setProperty:]" を使用し、"_property =" を使用しないため、カスタム セッターが常に使用されます。
最後に、VideoPlayerView は次のように dealloc メソッドを実装します。
はい、この無意味な抽象化をインライン化する必要があります! それにもかかわらず、これは、VideoPlayerView の割り当てが解除されると、そこに含まれるすべての強力なプロパティが監視を削除され、解放されて割り当てが解除されることを意味します。
したがって、このパターンは、私が観察しているクラッシュを次のように軽減するはずです。
a) クラス AVPlayerItem のインスタンス 0x170019730 の割り当てが解除されましたが、キー値オブザーバーがまだ登録されていました。
VideoPlayerView は、AVPlayerItem を観察する私の唯一のクラスです。VideoPlayerView は、監視している間ずっと AVPlayerItem への強力な参照を維持します。したがって、VideoPlayerView が動作している間は AVPlayerItem の割り当てを解除することはできず、その割り当てを解除する前に、VideoPlayerView は AVPlayerItem の後続の割り当て解除の前に AVPlayerItem の監視を停止します。
これはどのようにうまくいかないのですか?
b) [VideoPlayerView setPlayerItem:] オブザーバーとして登録されていないため、AVPlayerItem からキー パス "status" のオブザーバー VideoPlayerView を削除できません。
c) [VideoPlayerView setAsset:] オブザーバーとして登録されていないため、AVURLAsset 0x170233780 からキー パス「再生可能」のオブザーバー VideoPlayerView 0x145e3bbd0 を削除できません。
私のカスタム セッターは、プロパティを新規または着信 AVPlayerItem または AVURLAsset へのポインターに置き換える前に、以前に設定された AVPlayerItem または AVURLAsset の監視を削除しようとしています。
私のクラスがインスタンス化されるとき、_playerItem と _asset は nil です。したがって、以前の AVPlayerItem または AVURLAsset はすべて、カスタム セッターを介して設定されている必要があり、VideoPlayerView がこれらのキーパスのオブザーバーとして登録されている必要があります。
これらのプロパティは、監視を設定せずにどのように設定されていますか?
これらは、カスタム セッターでのメソッド呼び出しの順序に基づく恐ろしい競合状態ですか?
ここで私が見逃している基本的なものはありますか?
object-c ランタイムを使用して、これらのオブジェクトに関連付けられたオブジェクト プロパティ BOOL isObserved を作成し、オブザーバーを削除する前にサニティ チェックを実行できるようにすることを検討しています。現在の方法論の問題を考えると、これでも十分に堅牢ではない気がします。
どんな洞察や助けも大歓迎です。読んでくれてありがとう。
ios - HLS プレイリスト情報を読み取って、アイテムの preferredBitRate を動的に変更する
私はビデオ アプリに取り組んでいます。通常の mp4 ファイルから HLS に変更しています。変更を行う必要がある多くの理由の 1 つは、ビデオの帯域幅の使用をより詳細に制御できることです (他の多くのものをロードします)。そのため、エクスペリエンスを最適な方法で最適化する必要があります)。
そのためAVFoundation
、iOS10 では、次を使用して帯域幅を制御する機能が導入されました。
でアイテムの最大解像度を設定する設定も iOS11 で導入されたpreferredMaximumResolution
ので、それを使用していますが、iOS10 デバイス向けのソリューションが必要です。
さて、これで制御できるようになりましたpreferredPeakBitRate
が、問題があります。すべての HLS ソースが生成されたわけではないため、Wi-Fi ネットワークに接続していないときに最大解像度を 480p に設定したいとします。 、今日はそれを達成する方法がありません。選択しHLS playlist
た .
私が考えていたことの 1 つは、m3u8
ファイル内の情報を読み取って、少なくとも、プレーヤーが表示できるさまざまな品質のソースと、全員が必要とする帯域幅を知ることです。
これを行う1つの方法は、m3u8
プレイリストをプレーンテキストとしてダウンロードし、正規表現を使用してファイルを読み取り、このデータを処理することです.まあ、私はそれを避けようとしています.これははるかに難しくないと思います.
トラックからこの情報を読み取ることができません。なぜなら、a) 情報が見つからない、b) 品質を変更するとトラックが動的に置き換えられる、すべての品質レベルに対して 1 つのトラックだからです。
この情報を取得する方法がわかりません。google や stackoverflow を検索しましたが、この情報が見つかりません。誰か助けてくれますか?
これが私がやりたいことの例です。私はこの例のプレイリストを持っています:
そして、コード内の配列でその情報を利用できるようにしたいだけです。次のようになります。
そして、次のように印刷します。
ios11 - アプリを閉じたときのオフライン HLS Fairplay 再生エラー、コード 16227
AVContentSessionKey を使用する FairPlay Streaming Server SDK v4.0.1 のデモに従って、HLS Fairplay で Offline Playback を実装しています。3 つのコンテンツをダウンロードします。各コンテンツはダウンロードされ、ドキュメント ディレクトリの .movpkg とそのコンテンツ キーの両方が正しく保存されます。WIFI をオフにすると、ダウンロードされたこれらの 3 つのコンテンツは問題なく正しく再生され、次のコードを使用して再生されます。
ここまでは順調ですね。しかし、問題は、アプリケーションを閉じて (アプリケーションを閉じるためのホーム ボタン)、ダウンロードしたコンテンツを再生すると、最後にダウンロードされたコンテンツのみが正しく再生され、他のコンテンツ (1 番目と 2 番目) はこれらのエラーをコンソールに送信することです。
ドキュメントディレクトリのキーで .movpkg を再確認すると、正しく表示されます
エラーが発生する前に ContentKeyDelegate が呼び出され、キーが読み込まれてリクエストに正しく渡されます。
if persistableContentKeyExistsOnDisk(withContentKeyIdentifier: assetIDString) {
contentKeyRecipients を印刷すると、3 つのコンテンツが正しく表示されます
私のテストは iOS 11.1.2 と iOS 11.2 beta 2 にあります
何が起こっているのかわかりませんが、永続化されたキーに問題があるようです。各コンテンツを一度に 1 つの AVContentKeySession に関連付ける必要があるかどうかはわかりません。
誰かが同様の問題に直面した場合は、助けていただければ幸いです。
前もって感謝します
swift - Swift で AVAsset からビデオの長さを取得する方法
重複した質問かもしれませんが、解決に多くの時間を費やしました。mp4 ファイルを documentary ディレクトリにダウンロードします。この関数ですべてのファイル名を取得できます。
そして、これらのファイルの時間の長さをすべて取得したいと思います。私が試したことを示しましょう:
出力は
私の意見では、ビデオ ファイルの URL を取得しようとしたときに間違っていました。しかし、それを修正する方法。私は多くのことを試します。ファイルが存在するかどうかも確認します。もちろん存在します。
また、私は試します
残念ながらそれは動作しません..