-
Notifications
You must be signed in to change notification settings - Fork 0
PoC 방송 수신
In Ye, Kim edited this page Nov 7, 2024
·
3 revisions
PoC 방송 수신을 작업한 과정을 작성한 문서입니다.
- Live Station API를 사용해서 송출중인 방송 수신
- 참고문서: Live Station API
- 개요: PoC를 위해 Live Station API를 사용해 송출중인 방송
썸네일을 불러오는 작업을 수행했습니다.
썸네일은 Live Station에서 자동으로 만들어줍니다.
요청 URL과 파라미터를 세팅했습니다.
헤더 시그니처를 만들때 중요한 부분은 시그니처를 만드는 부분입니다.
- 시그니처 생성에 필요한 메시지(문자열)을 만듭니다.
- 이때
HTTP 메서드(GET)과요청 URL 경로와쿼리스트링, 타임스탬프, 엑세스키가 필요합니다. - 타임스탬프는 요청 헤더의 타임스탬프와 정확하게 동일해야합니다.
- HMAC SHA256으로 서명 생성
- 시크릿키와 메시지를 UTF-8 문자열로 변환해서 HMAC 함수에서 사용할 준비를 합니다.
- 서명을 만들기 위해서 시크릿 키를 HmacSHA256 알고리즘의 키로 설정하여 바이트 값을 저장합니다.
- Base64인코딩
- 생성된 HMAC 서명을 Base64로 인코딩합니다.
- 최종 시그니처를 반환합니다.
func makeSignature(serviceUrlType: String) -> String? {
let space = " "
let newLine = "\n"
let method = "GET"
let url = "/api/v2/channels/ls-20241105131641-go2pN/serviceUrls?serviceUrlType=\(serviceUrlType)"
let accessKey = ServiceURLAPI.accessKey
let secretKey = ServiceURLAPI.secretKey
let timestamp = String(Int(Date().timeIntervalSince1970 * 1000))
// 1. 메시지 생성
let message = "\(method)\(space)\(url)\(newLine)\(timestamp)\(newLine)\(accessKey)"
// 2. HMAC SHA256으로 서명 생성
guard let keyData = secretKey.data(using: .utf8),
let messageData = message.data(using: .utf8) else {
return nil
}
var hmac = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
messageData.withUnsafeBytes { messageBytes in
keyData.withUnsafeBytes { keyBytes in
// HMAC해싱을 수행
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), keyBytes.baseAddress, keyData.count, messageBytes.baseAddress, messageData.count, &hmac)
}
}
let hmacData = Data(hmac)
let base64Signature = hmacData.base64EncodedString()
return base64Signature
}타임스탬프
- ‘밀리초’ 계산을 해주지 않아서 인증 오류가 발생했습니다.
String(Int(Date().timeIntervalSince1970)) //오류
String(Int(Date().timeIntervalSince1970 * 1000))-
메시지를 생성하지 않고시크릿 키로만 서명을 생성해서 인증 오류가 발생했습니다.
- 참고문서: Live Station API
- 개요: PoC를 위해 Live Station API를 사용해 송출중인 방송을 불러오는 작업을 수행했습니다.
- 파라미터만 변경하고, 나머지는 동일하게 요청을 보냅니다.
- 받아온 url을 AVKit을 사용해서 플레이합니다.
let playerController = AVPlayerViewController()
let player = AVPlayer(url: fileURL)
playerController.player = player
self.present(playerController, animated: true) {
player.play()
}[URL Session]
[ReplayKit]
[Git]
[RTMP]
[기타]