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:
yumoqing 2026-06-24 22:59:44 +08:00
parent ff4902ffe6
commit c7bb63bb7e
2 changed files with 24 additions and 6 deletions

View File

@ -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

View File

@ -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)
}
} }
} }
} }