Как перехватить запросы сегмента HLS в iOS AvPlayerIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как перехватить запросы сегмента HLS в iOS AvPlayer

Сообщение Anonymous »

Я пытаюсь перехватить запросы сегмента 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»