fix: HLS播放加自定义headers + 录制finishWriting错误日志
HLS播放: - AVURLAsset替代AVPlayerItem(url:),加Referer/UA headers - 某些HLS流服务端校验Referer,裸URL请求被拒绝 录制: - startWriting检查返回值和error - finishWriting回调打印status/error/frames - 失败时删除损坏的临时文件,弹出错误提示
This commit is contained in:
parent
ff4902ffe6
commit
c7bb63bb7e
@ -167,7 +167,13 @@ final class PlayerBridge: ObservableObject {
|
|||||||
itemStatusObserver?.invalidate()
|
itemStatusObserver?.invalidate()
|
||||||
itemStatusObserver = nil
|
itemStatusObserver = nil
|
||||||
|
|
||||||
let playerItem = AVPlayerItem(url: item.url)
|
// 用 AVURLAsset 支持自定义 HTTP headers(某些 HLS 流需要 Referer/UA)
|
||||||
|
let headers: [String: String] = [
|
||||||
|
"Referer": item.url.deletingLastPathComponent().absoluteString,
|
||||||
|
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15"
|
||||||
|
]
|
||||||
|
let asset = AVURLAsset(url: item.url, options: ["AVURLAssetHTTPHeaderFieldsKey": headers])
|
||||||
|
let playerItem = AVPlayerItem(asset: asset)
|
||||||
|
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
// 添加 video output 用于录制
|
// 添加 video output 用于录制
|
||||||
|
|||||||
@ -98,9 +98,16 @@ final class PlayerRecorder: NSObject {
|
|||||||
audioInput = aInput
|
audioInput = aInput
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.startWriting()
|
let success = writer.startWriting()
|
||||||
|
if !success {
|
||||||
|
print("[Recorder] startWriting failed: \(writer.error?.localizedDescription ?? "unknown")")
|
||||||
|
onError?("Cannot start writer: \(writer.error?.localizedDescription ?? "unknown")")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// session 起点为 0,视频和音频都用相对时间戳
|
// session 起点为 0,视频和音频都用相对时间戳
|
||||||
writer.startSession(atSourceTime: .zero)
|
writer.startSession(atSourceTime: .zero)
|
||||||
|
print("[Recorder] Writer started, session at .zero")
|
||||||
|
|
||||||
// 启动视频抓帧
|
// 启动视频抓帧
|
||||||
isRecording = true
|
isRecording = true
|
||||||
@ -136,11 +143,16 @@ final class PlayerRecorder: NSObject {
|
|||||||
|
|
||||||
writer?.finishWriting { [weak self] in
|
writer?.finishWriting { [weak self] in
|
||||||
Task { @MainActor in
|
Task { @MainActor in
|
||||||
guard let self = self else { return }
|
guard let self = self, let w = self.writer else { return }
|
||||||
if let url = self.tempURL {
|
let count = self.captureFrameCount
|
||||||
let count = self.captureFrameCount
|
print("[Recorder] finishWriting status: \(w.status.rawValue), error: \(w.error?.localizedDescription ?? "none"), frames: \(count)")
|
||||||
print("[Recorder] Finish writing: \(count) video frames")
|
if w.status == .completed, let url = self.tempURL {
|
||||||
self.showSaveDialog(tempURL: url)
|
self.showSaveDialog(tempURL: url)
|
||||||
|
} else {
|
||||||
|
self.onError?("Recording failed: \(w.error?.localizedDescription ?? "unknown (status=\(w.status.rawValue))")")
|
||||||
|
if let url = self.tempURL {
|
||||||
|
try? FileManager.default.removeItem(at: url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user