Я пытаюсь перехватить запросы сегмента HLS, сделанные AvPlayer в iOS с целью расшифровки, но у меня возникают проблемы с тем, чтобы он работал. /> CustomurlProtocol: это совсем не работает для меня, но мысль заключалась в том, чтобы перехватить запросы сегмента .m4s. CustomurlProtocol Методы. < /P>
Вот моя текущая реализация: < /p>
import AVKit
import SwiftUI
class CustomURLProtocol: URLProtocol {
static var requestHandler: ((URLRequest) -> (URLResponse?, Data?, Error?))?
override class func canInit(with request: URLRequest) -> Bool {
// Intercept only HLS segment requests
print("CustomURLProtocol canInit called for URL: \(request.url?.absoluteString ?? "")")
return request.url?.pathExtension == "m4s"
}
override class func canonicalRequest(for request: URLRequest) -> URLRequest {
return request
}
override func startLoading() {
guard let handler = CustomURLProtocol.requestHandler else {
return
}
let (response, data, error) = handler(request)
if let response = response {
client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed)
}
if let data = data {
client?.urlProtocol(self, didLoad: data)
}
if let error = error {
client?.urlProtocol(self, didFailWithError: error)
}
client?.urlProtocolDidFinishLoading(self)
}
override func stopLoading() {
// This method is called if the request gets canceled or completed
}
}
class CustomResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate {
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {
// This only processes the m3u8 playlists. We know this because we don't allow it to process m4s and the video still plays
// NOTE: HLS SEGMENTS DO NOT GO THROUGH HERE AS THE AVPLAYER HANDLES THEM
// Ensure we have a URL to work with
guard let url = loadingRequest.request.url else {
return false
}
print("CustomResourceLoaderDelegate: \(url)")
// For all other files, implement the redirect logic
var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
components?.scheme = "https"
guard let httpsURL = components?.url else {
return false
}
// Create a redirect response
let response = HTTPURLResponse(url: url, statusCode: 302, httpVersion: nil, headerFields: ["Location": httpsURL.absoluteString])
// Set the response on the loading request
loadingRequest.response = response
loadingRequest.finishLoading()
return true
}
}
struct VideoSecurityDemo: View {
private let player: AVPlayer
private let resourceLoaderDelegate = CustomResourceLoaderDelegate()
init() {
// Register the CustomURLProtocol
URLProtocol.registerClass(CustomURLProtocol.self)
// Set up the request handler
CustomURLProtocol.requestHandler = { request in
print("Intercepted HLS segment request: \(request.url?.absoluteString ?? "")")
// Perform the actual request
let semaphore = DispatchSemaphore(value: 0)
var responseData: Data?
var responseError: Error?
var responseURL: URLResponse?
let task = URLSession.shared.dataTask(with: request) { data, response, error in
responseData = data
responseError = error
responseURL = response
semaphore.signal()
}
task.resume()
_ = semaphore.wait(timeout: .distantFuture)
return (responseURL, responseData, responseError)
}
let urlString = "customscheme://mywebsite.com/file.m3u8"
guard let url = URL(string: urlString) else {
fatalError("Invalid URL")
}
let asset = AVURLAsset(url: url)
asset.resourceLoader.setDelegate(resourceLoaderDelegate, queue: .main)
let item = AVPlayerItem(asset: asset)
self.player = AVPlayer(playerItem: item)
}
var body: some View {
VideoPlayer(player: player)
.edgesIgnoringSafeArea(.all)
.onAppear {
print("VideoPlayer appeared, starting playback")
player.play()
}
.onDisappear {
print("VideoPlayer disappeared, pausing playback")
player.pause()
}
}
}
#Preview {
VideoSecurityDemo()
}
< /code>
Я бы хотел, чтобы было решение, похожее на AvassetresourceloaderDelegate. Я надеюсь, что есть что -то, что я пропустил. Следующее, что я собираюсь попробовать, это локальный подход HTTP Server.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/789 ... s-avplayer
Как перехватить запросы сегмента HLS в iOS AvPlayer ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
LL-HLS: iOS/iPados AvPlayer с просьбой M3U8 с отсутствующей директивой доставки _HLS_PART
Anonymous » » в форуме IOS - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему я получаю запросы .ts и .aac на сервер при воспроизведении загруженного HLS?
Anonymous » » в форуме IOS - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-