バッファリングして、すぐにremote url
オーディオをSwift言語で再生しようとしました。
しかし、問題はreadyToPlay
ケースアンドプレイに時間がかかります。
たとえば、サウンドURLの実行には約12〜15秒かかります。
これは私のコードです:
var asset: AVAsset!
var player: AVPlayer!
var playerItem: AVPlayerItem!
private var playerItemContext = 0
let requiredAssetKeys = [ "playable","hasProtectedContent"]
let url = URL(string: "http://sound_link.mp3")!
asset = AVAsset(url: url)
playerItem = AVPlayerItem(asset: asset,
automaticallyLoadedAssetKeys: requiredAssetKeys)
playerItem.addObserver(self,
forKeyPath: #keyPath(AVPlayerItem.status),
options: [.old, .new],
context: &playerItemContext)
player = AVPlayer(playerItem: playerItem)
これによると (ExploringAVFoundation)ドキュメントはそれをやった
ハンドルのために、そのプレーヤーはプレーヤーがプレーする準備ができていますobserveValue func
を使用します:
override func observeValue(forKeyPath keyPath: String?,of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard context == &playerItemContext else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
return
}
if keyPath == #keyPath(AVPlayerItem.status) {
let status: AVPlayerItemStatus
if let statusNumber = change?[.newKey] as? NSNumber {
status = AVPlayerItemStatus(rawValue: statusNumber.intValue)!
} else {
status = .unknown
}
// Switch over status value
switch status {
case .readyToPlay:
print("readyToPlay \(status.rawValue)")
player.play() // here play remote sound
case .failed:
print("readyToPlay \(status.rawValue)")
case .unknown:
print("failed \(status.rawValue)")
}
}
}
そして、これはログを返します:
2017-02-08 13:44:00.626036 [15144:3747850] [aqme] 255: AQDefaultDevice (1): skipping input stream 0 0 0x0
readyToPlay 1
2017-02-08 13:44:02.631182 [15144:3747850] [aqme] 255: AQDefaultDevice (173): skipping input stream 0 0 0x0
上記のログでは、readyToPlay 1
が表示されるまで4秒かかり、その後サウンドを再生するのに10秒かかります
サーバーの速度は良好であり、サーバーサウンドをAndroid
で再生しようとしましたが、サウンドをバッファリングおよび再生する最大時間は約3秒です(Android
アプリケーションでは)が、IOS
バッファリングではサウンドを完全に再生するには、約15秒かかります!
ご清聴ありがとうございました
これを使用してみてください:
player.automaticallyWaitsToMinimizeStalling = false
avPlayerItem
をURLでインスタンス化してから、グローバルスレッドで他のアセットを取得しようとすると、avPlayer
がメインUIスレッドでアセットを取得しようとするため、問題が発生すると思いますavAssets
から字幕オプションを読み取る
これは私が私の問題を解決した方法です(Swift 2)で、私はそれが役立つことを願っています:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
let avMediaSelectionGroup : AVMediaSelectionGroup? = self.container.player.currentItem?.asset.mediaSelectionGroupForMediaCharacteristic(AVMediaCharacteristicLegible)
dispatch_async(dispatch_get_main_queue(), {
if (avMediaSelectionGroup != nil && (avMediaSelectionGroup!.options.count != 0) && avMediaSelectionGroup?.options[0].valueForKey("title") != nil)
{
// show hide subtitle button
}
})
})
AVPlayerでも同じ遅延再生の問題があります。ソースURLは、sam LAN内のiPhone以外の私のMACです。遅延時間は6秒から12秒です。 https://stackoverflow.com/users/4083045/vlad-hatko @Vlad Hatkoの答えは解決に役立ちました。どうもありがとう。 「player.automaticallyWaitsToMinimizeStalling = false」を追加するだけで、遅延の問題は魅力のように解決します。