在 iOS SDK - AVPlayer 中手动选择视频质量的 HLS 流?

Posted

技术标签:

【中文标题】在 iOS SDK - AVPlayer 中手动选择视频质量的 HLS 流?【英文标题】:HLS Streaming with manual video quality selection in iOS SDK - AVPlayer? 【发布时间】:2018-10-03 12:32:10 【问题描述】:

我们已经使用 AVPlayer 实现了 HLS 流,

 fileURL = [NSURL URLWithString:@"https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8"];
 avAsset = [AVURLAsset assetWithURL:fileURL];
 AVPlayerItem *avPlayerItem =[[AVPlayerItem alloc]initWithAsset:self->avAsset];
 self->avPlayer = [AVPlayer playerWithPlayerItem:avPlayerItem];

它是根据网络速度自动选择视频质量,我们需要通过用户选择手动选择视频质量。但我们无法手动选择媒体文件(质量 1080p、720p、270p 等)。

如果有人知道使用手动质量选择的 HLS 流式传输,请分享您的想法。提前致谢!

【问题讨论】:

查看这个:***.com/questions/43095311/… @Kuldeep 我们只有一个 .m3u8 格式的 URL,当网络变化时它会自动选择质量,我们没有多个 URL。如果有任何其他方式可用于从 HLS URL 中选择特定质量,请解释 @ram,你有解决办法吗? @softdev 是的,我会尽快给出答案 【参考方案1】:

您可以通过指定来设置质量:

currentPlayerItem.preferredMaximumResolution = your value
currentPlayerItem.preferredForwardBufferDuration = your value

但最终播放器会自行调整质量,因为 HLS 是一种自适应流,可根据可用带宽调整其质量。

【讨论】:

【参考方案2】:

是的,我们可以,但我不确定这是正确的方式。但它对我有用

首先,我们需要获得视频所需的所有品质。 有两种方法可以得到这个选项

    通过 API 从后端本身获取它 “m3u8”您实际上可以下载并阅读其内容。您所要做的就是获取键“RESOLUTION”的值

会是这样的

在您获得解决方案列表之后。您必须将其作为列表或选项显示给用户。

然后是第二点。 如何使选择的分辨率在 AVPlayer 中播放。

AVPlayer 有一个选项叫PreferredPeakBitRate

之后,我们必须通过我计算的这些值来设置比特率。 应用到当前播放器

 open func setBitRate(_ definition: String) 
    // 1. 240p = 700000
    // 2. 360p = 1500000
    // 3. 480p = 2000000
    // 4. 720p = 4000000
    // 5. 1080p = 6000000
    // 6. 2k = 16000000
    // 7. 4k = 45000000
    var maxBitRate: Double = 0
    switch definition 
    case "240p":
        maxBitRate = 700000
    case "360p":
        maxBitRate = 1500000
    case "480p":
        maxBitRate = 2000000
    case "720p":
        maxBitRate = 4000000
    case "1080p":
        maxBitRate = 6000000
    case "2k":
        maxBitRate = 16000000
    case "4k":
        maxBitRate = 45000000
    case "Auto":
        maxBitRate = 0
    default:
        maxBitRate = 0
    
    player?.currentItem?.preferredPeakBitRate = maxBitRate
    print("Playing in Bit Rate \(String(describing: player?.currentItem?.preferredPeakBitRate))")

虽然播放器需要一点时间来更新比特率,但它肯定会起作用。

【讨论】:

以上是关于在 iOS SDK - AVPlayer 中手动选择视频质量的 HLS 流?的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayer replaceCurrentItemWithPlayerItem 在 iOS 4.3.3+ 上不起作用

是否可以手动安装最新的 Firebase Crashlytics iOS SDK?

如何手动导入或安装 SDK?

设备自动锁定时,AVPlayer 无法在 iPad 上运行

在 iOS 中获取 AVPlayer 的音量

使用 AVPlayer 在 iOS 中音频流期间的播放速度