如何在swift中获取视频.m38u文件url支持的分辨率

Posted

技术标签:

【中文标题】如何在swift中获取视频.m38u文件url支持的分辨率【英文标题】:how to fetch resolution supported by video .m38u file url in swift 【发布时间】:2017-11-16 01:21:19 【问题描述】:

我目前正在使用 AVPlayerViewController / AVPlayer 处理 HTTP 直播视频

我正在播放一个支持 .m3u8 文件的视频

它播放得很好,但我的问题是我能否拥有视频数据,就像在生成 .m3u8 文件时必须设置 4 种分辨率一样,我可以在终点改变分辨率现在问题是如何获取我在端点设置的所有值。我正在玩,这也是在 android 中,使用 Track 我能够获取所有视频信息,但在 ios 中,我如何获取包含视频的所有详细信息,例如它的高度、轨道、视频支持的分辨率等。

我已经搜索了很多但无法成功..需要帮助提前谢谢

    #EXTM3U

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="stereo",LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES,URI="audio/stereo/en/128kbit.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="stereo",LANGUAGE="dubbing",NAME="Dubbing",DEFAULT=NO,AUTOSELECT=YES,URI="audio/stereo/none/128kbit.m3u8"

#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="surround",LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES,URI="audio/surround/en/320kbit.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="surround",LANGUAGE="dubbing",NAME="Dubbing",DEFAULT=NO,AUTOSELECT=YES,URI="audio/stereo/none/128kbit.m3u8"

#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Deutsch",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="de",URI="subtitles_de.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",URI="subtitles_en.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Espanol",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="es",URI="subtitles_es.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Français",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="fr",URI="subtitles_fr.m3u8"

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=258157,CODECS="avc1.4d400d,mp4a.40.2",AUDIO="stereo",RESOLUTION=422x180,SUBTITLES="subs"
video/250kbit.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=520929,CODECS="avc1.4d4015,mp4a.40.2",AUDIO="stereo",RESOLUTION=638x272,SUBTITLES="subs"
video/500kbit.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=831270,CODECS="avc1.4d4015,mp4a.40.2",AUDIO="stereo",RESOLUTION=638x272,SUBTITLES="subs"
video/800kbit.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1144430,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="surround",RESOLUTION=958x408,SUBTITLES="subs"
video/1100kbit.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1558322,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="surround",RESOLUTION=1277x554,SUBTITLES="subs"
video/1500kbit.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=4149264,CODECS="avc1.4d4028,mp4a.40.2",AUDIO="surround",RESOLUTION=1921x818,SUBTITLES="subs"
video/4000kbit.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=6214307,CODECS="avc1.4d4028,mp4a.40.2",AUDIO="surround",RESOLUTION=1921x818,SUBTITLES="subs"
video/6000kbit.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=10285391,CODECS="avc1.4d4033,mp4a.40.2",AUDIO="surround",RESOLUTION=4096x1744,SUBTITLES="subs"
video/10000kbit.m3u8

【问题讨论】:

你找到解决办法了吗? 你有什么解决办法吗?是否有可能从IOS中的.m3u8文件中获得不同的质量选项? 没有@CoderSulemani 没有@Uma Sankar Buddi 经过一些研究,我得出一个结论,在 iOS 中,我们可以从 .m3u8 视频中获取音频、字幕轨道,但不能获取不同的质量选项。即使您知道质量选项,我们也无法使用 AVPlayerItem 选择这些选项。 :( 【参考方案1】:
var urlData: Data!
var savedString: String!

urlString = "https://xcxc.xxxxx.app/mobile/test.m3u8"

if let url = URL(string: urlString) 
                 urlData = try Data(contentsOf: url)
                 savedString = String(data: urlData, encoding: .utf8)

【讨论】:

【参考方案2】:

是的,如果视频在播放器中播放,您可以获得自然大小的视频。 正如您所说,您正在 AVPlayer 中播放 URL,然后使用以下代码获取播放曲目的自然大小。

if let track = self.tampPlayer?.currentItem?.tracks.first 
        print("Size = \(track.assetTrack.naturalSize)")

无论网址是什么,如果它在播放器中播放,视频的大小都会挑衅。

【讨论】:

我说的是分辨率大小....我怎么能得到那个....我必须创建类似质量列表并根据所选分辨率进行更改,就像你管一样.....有你有什么解决方案吗????? 我整理了你的代码,但它返回给我 ~ DemoVideo.MediaPlaylist 要更改视频质量,您必须为每个比特率创建不同的 url,例如 144、320、480、640、720、1080 等。并将其显示在播放器屏幕上,只要用户愿意更改您必须使用与所选比特率相关的 url 重新加载播放器项目的比特率。 要改变质量,我必须设置一些列表,如 320,480,720 如何从 url 获取这个,这是我的重点.....有一些想法??? 为不同比特率创建 URL 的人会影响您的后端合作伙伴或任何第三方。他们将为您提供各自比特率的不同网址。

以上是关于如何在swift中获取视频.m38u文件url支持的分辨率的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中读取视频文件的第一个和最后一个 64kb

Swift:Parse 不会从 URL 加载视频

ffmpeg如何从url获取视频帧数据

如何直接从复制或分享 URL 中获取 Instagram 图片或视频 URL?

Swift:从 url 保存视频数据时出错

Swift 中的 iOS 共享扩展抓取 URL