在iOS设备上以编程方式限制HLS流的比特率

4
我有一个高清视频正在流式传输到iOS应用程序。我希望允许用户能够限制最高的流媒体质量(低,中,高),因为当以最大比特率流式传输时,视频大小可能会达到几个GB。同样的,在基于蜂窝或WiFi连接自动选择设置时,考虑到数据流量限制问题。
我没有问题通过访问AVPlayerItemAccessLogEvent获取当前比特率,但在强制更低的质量流方面却感到困惑。
使用HLS是否可能实现这一点?谢谢!
2个回答

5

如果您正在使用AVPlayer,则正确的方法应该是:

preferredPeakBitRate

从苹果文档这里得知,此项内容为该项目所需的网络带宽消耗的期望上限,单位为每秒比特数。

你能指导我如何使用preferredPeakBitRate吗?你能提供演示代码吗? - Kuldeep
@iOS大神,如果您有的话,我也需要演示文稿。 - Gautam Sareriya
这个函数需要传入360、720、1080和自动模式的值。 - SwathiK

3
这不算是动态的解决方案,但我通过创建四个不同的 m3u8 播放列表来解决了这个问题。我为每个播放列表打上标签,以表示流媒体的质量(低、中、高、极高)。用户可以根据所需的最大质量选择其中一个。极高的播放列表包含所有质量的 URL。高的播放列表比极高的少一些 URL,中的比高的少一些 URL,低的比中的少一些 URL。每当用户选择不同的质量时,我只需要将基本流媒体播放列表切换到相应的质量播放列表 URL。
以下是四个不同播放列表的简单示例。
HLS_Movie_Extreme.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000
stream-0-64000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=350000
stream-1-350000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000
stream-2-800000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1200000
stream-3-1200000/index prog_index.m3u8 m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1800000
stream-4-1800000/prog_index.m3u8

HLS_Movie_High.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000
stream-0-64000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=350000
stream-1-350000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000
stream-2-800000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1200000
stream-3-1200000/index prog_index.m3u8 m3u8

HLS_Movie_Medium.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000
stream-0-64000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=350000
stream-1-350000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000
stream-2-800000/prog_index.m3u8

HLS_Movie_Low.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000
stream-0-64000/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=350000
stream-1-350000/prog_index.m3u8

就像我所说的,虽然不是动态的,但您可以使用各种技术来获取用户的网络连接并在需要时指向所需的质量播放列表。对我而言,获取用户的偏好并相应地调整流媒体内容就已经足够了。


你如何从m3u8文件中选择特定的流,能否分享一段代码片段?谢谢! - Romk1n
1
@Romk1n 我已经有一段时间没有处理过这个代码了,所以我手头没有一个代码片段。它基本上与停止当前流并同时开始新流相同。您要切换到的播放列表将使用相同的HLS文件,您只需要提供更高质量的文件。因此,在切换流之前取得播放器时间,切换流并从那个时间开始播放。希望这能帮到你! - timgcarlson
@timgcarlson建议完全重置播放器,并且从应用程序中,我们必须记住当前的播放时间,在使用所需比特率进行重置后,寻找相同的位置。有可能播放器在加载时显示为空白。是否有其他更好的方法? - Santhosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接