我有一个链接,我想在我的应用程序中播放 -
用于播放视频的视图 -
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 视图中并给它一个框架
当我在模拟器或真实设备中打开应用程序时,我得到 -
请帮助我了解我在这里做错了什么以及如何纠正?
期待视频播放,我尝试使用第三方视频播放器和 SFSafariBrowser 来播放网址,但仍然没有帮助
您的链接是一个 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"