【问题标题】:HLS Streaming with manual video quality selection in iOS SDK - AVPlayer?在 iOS SDK - AVPlayer 中手动选择视频质量的 HLS 流?
【发布时间】: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 流式传输,请分享您的想法。提前致谢!

【问题讨论】:

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

标签: ios objective-c swift avplayer http-live-streaming


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    1. 通过 API 从后端本身获取它
    2. “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))")
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-11-22
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 2017-09-03
      • 2020-06-18
      相关资源
      最近更新 更多