首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当视频暂停时,AVPlayer Fairplay HLS不会停止音频播放

当视频暂停时,AVPlayer Fairplay HLS不会停止音频播放
EN

Stack Overflow用户
提问于 2017-04-01 02:44:48
回答 1查看 1.7K关注 0票数 1

我在https://developer.apple.com/streaming/fps/上按照苹果的Fairplay Streaming示例代码使用Fairplay实现,尽管我试图只选择与在线Fairplay流媒体相关的部分,而不是持久性/离线播放。在下面的代码中,没有Fairplay的视频正常播放/暂停/查找,但当我播放受Fairplay保护的视频时,只有视频轨道运行正常。

暂停播放不会停止音频播放,更改音频轨道不会停止前一个音频轨道,因此这两个音轨一起播放,可能搜索也不起作用。

除了下面的助手类之外,我还有来自苹果客户端的FairPlay流媒体服务器软件开发工具包https://developer.apple.com/streaming/fps/示例代码的AssetLoaderDelegateAssetPlaybackManager,我已经更新了代码来处理我们的FairPlay密钥提供商的SPC/CKC。

我是不是错过了实现代码的一些重要部分来处理FPS流的音频?你能给我指出正确的方向吗?非常感谢。

代码语言:javascript
运行
复制
class PlayHelper {

    static let shared = PlayHelper()

    fileprivate var playerViewController: PlayerViewController?

    init() {

        AssetPlaybackManager.sharedManager.delegate = self
    }

    // Play video without DRM
    func playVideo(from urlString: String, at context: UIViewController) {

        guard let videoURL = URL(string: urlString) else {
            Log.error("Video URL can't be created from string: \(urlString)")
            return }

        let player = AVPlayer(url: videoURL)

        let playerViewController = PlayerViewController()
        playerViewController.player = player

        context.present(playerViewController, animated: true) {
            playerViewController.player?.play()
        }
    }

    // Play FPS video
    func playFpsVideo(with asset: AVURLAsset, at context: UIViewController) {

        // Cleanup, should be done when playerViewController is actually dismissed
        if self.playerViewController != nil {
            // The view reappeared as a results of dismissing an AVPlayerViewController.
            // Perform cleanup.
            AssetPlaybackManager.sharedManager.setAssetForPlayback(nil)
            self.playerViewController?.player = nil
            self.playerViewController = nil
        }

        let item = AVPlayerItem(asset: asset)

        let player = AVPlayer(playerItem: item)

        // Customize player
        player.appliesMediaSelectionCriteriaAutomatically = true

        let playerViewController = PlayerViewController()
        playerViewController.player = player

        self.playerViewController = playerViewController

        context.present(playerViewController, animated: true) {
            playerViewController.player?.play()
        }
    }

    // Stop video
    func stop() {

        // Cleanup, should be done when playerViewController is dismissed
        if self.playerViewController != nil {

            // Results of dismissing an AVPlayerViewController, perform cleanup
            AssetPlaybackManager.sharedManager.setAssetForPlayback(nil)
            self.playerViewController?.player = nil
            self.playerViewController = nil
        }
    }
}


// MARK: - Extend `PlayHelper` to conform to the `AssetPlaybackDelegate` protocol

extension PlayHelper: AssetPlaybackDelegate {

    func streamPlaybackManager(_ streamPlaybackManager: AssetPlaybackManager, playerReadyToPlay player: AVPlayer) {

        player.play()
    }

    func streamPlaybackManager(_ streamPlaybackManager: AssetPlaybackManager, playerCurrentItemDidChange player: AVPlayer) {

        guard let playerViewController = playerViewController, player.currentItem != nil else { return }

        playerViewController.player = player
    }
}

如果需要,我还可以提供AssetLoaderDelegateAssetPlaybackManager格式的代码。

EN

回答 1

Stack Overflow用户

发布于 2017-04-01 07:41:46

是我的错。我在上面的代码中调用了play()两次...Grrr..第一次是在PlayerViewController的表示完成时,第二次是在AssetPlaybackDelegate的回调中,这是由AssetPlaybackManager中的KVO触发的。这样,播放器控件就会停止播放视频,但很可能还有第二个(音频)流在那里播放。我删除了playerReadyToPlay回调中的play(),现在播放器中的所有控件都可以正常工作了。我可以暂停,恢复,查找,改变音轨。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43147627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档