视频网址未在我的 swift 应用程序中播放(播放按钮被禁用)

问题描述 投票:0回答:1

我有一个链接,我想在我的应用程序中播放 -

这个 - https://video-m2se42aed.msigma.in/video/7282/0/1094/6498c142878c493e93d0e6a90312d6ea/ece_nt_bombay_1/master.m3u8?sd=10&b=1200&rebase=on

用于播放视频的视图 -

import SwiftUI
import AVKit
import AVFoundation

struct MyView: UIViewControllerRepresentable {
    
    var videoURLString: String

    typealias UIViewControllerType = AVPlayerViewController
    
    func makeUIViewController(context: Context) -> AVPlayerViewController {
           // Return MyViewController instance
        if let url = URL(string: videoURLString) {
            let player = AVPlayer(url: url)
            let playerViewController = AVPlayerViewController()
            playerViewController.player = player
            return playerViewController
        }
        return AVPlayerViewController()
       }
       
       func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {
       }
}

然后我把它放在另一个 swiftui 视图中并给它一个框架

当我在模拟器或真实设备中打开应用程序时,我得到 -

当我将此网址放入我的 chrome 选项卡时,我得到 -

请帮助我了解我在这里做错了什么以及如何纠正?

期待视频播放,我尝试使用第三方视频播放器和 SFSafariBrowser 来播放网址,但仍然没有帮助

swift swiftui avfoundation avkit m3u
1个回答
0
投票

您的链接是一个 m3u8 播放列表,其标签将其标识为 HTTP Live Streaming,Apple 对 m3u 格式的扩展。 理论上,

AVPlayer
应该能够播放这些播放列表。

使用类似 url 进行测试 https://m3u8play.dev/?url=https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8 表明

AVPlayer
实际上可以处理这种格式,尽管它似乎对列表的构造方式很挑剔。

我无法告诉你你的播放列表出了什么问题,但我有另一个解决方案: 在链接的 m3u8 播放列表中有一个 URI 组件,可以手动提取并用作可播放的 URL。如果您有许多相同形式的播放列表,您可以使用它来提取 URL:

// Get first "#EXT-X-STREAM-INF" URI item from given playlist URL
    func getStreamUrl(playlistUrl: URL) -> URL? {
        do {
            let playlist = try String(contentsOf: playlistUrl)
            let playlistLines = playlist.components(separatedBy: .newlines).filter { !$0.isEmpty }        
            guard let streamComponentIndex = playlistLines.firstIndex(where: { $0.starts(with: "#EXT-X-STREAM-INF:") }) else { return nil }
            let streamComponent = playlistLines[streamComponentIndex + 1]
            let streamUrl = playlistUrl.deletingLastPathComponent().appendingPathComponent(streamComponent, conformingTo: .m3uPlaylist)
            
            print(streamUrl.absoluteString)
            return streamUrl
            
        } catch {
            print("ERROR:", error)
        }  
        return nil 
    }

像这样使用它:

let url = "https://video-m2se42aed.msigma.in/video/7282/0/1094/6498c142878c493e93d0e6a90312d6ea/ece_nt_bombay_1/master.m3u8"
let streamUrl = getStreamUrl(playlistUrl: videoUrl)!
// "streamUrl: https://video-m2se42aed.msigma.in/video/7282/0/1094/6498c142878c493e93d0e6a90312d6ea/ece_nt_bombay_1/media-1/stream.m3u8"
© www.soinside.com 2019 - 2024. All rights reserved.