ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS 18 부터 AVPlayer 재생 안되는 문제 해결하기
    🧑‍💻/Swift 2024. 11. 15. 13:27
    반응형

    AVPlayer를 사용한 동영상 재생이 iOS 18로 업데이트 후 재생이 안되는 문제가 발생했습니다.
    같은 앱인데 iOS 17에서는 정상 동작하는데, iOS 18 기기만 재생이 안됩니다.

    재생에 실패하면 이런 이미지가 뜹니다.

     

    재생이 안될 땐 2가지를 확인해 보아야 하는데

    1. AVPlayerItem.status

    if let status = player.currentItem?.status {
        print("AVPlayerItem status: \(status.rawValue)")
    }

    AVPlayer에 설정한 AVPlayerItem의 status를 찍어보니 failed (2)가 나오더라구요.

    2. AVPlayerItem.error

    if let error = player.currentItem?.error {
        print("AVPlayerItem error: \(error)")
    }

    마찬가지로 error 변수가 있어서 찍어 보았습니다.

    Domain=NSCocoaErrorDomain Code=257 "해당 파일을 볼 수 있는 권한이 없기 때문에 열 수 없습니다." UserInfo={NSUnderlyingError=0x302f994d0 {Error Domain=NSOSStatusErrorDomain Code=-12203 "(null)"}

     

    저는 다음과 같이 AVAsset을 사용해서 AVPlayerItem을 만들고 AVPlayer에 주입했었습니다.
    여기서 videoPath은 기기 내부의 영상 URL을 지정했었는데 이 부분이 보안 업데이트가 된 듯 했습니다.

    (다시 생각해보면 로컬 파일에 URL로 직접 접근하는 건 보안 상 위험한 방식이었습니다. iOS 18부터 보안이 개선되었네요.)

    let videoPath = "로컬 비디오 파일 URL"
    let avAsset = AVAsset(url: URL(fileURLWithPath: videoPath))
    let avPlayerItem = AVPlayerItem(asset: avAsset)
    player.replaceCurrentItem(with: avPlayerItem)

     

    Photos의 PHImageManager를 사용해서 PHAsset을 AVAsset로 변환한 뒤,
    AVPlayerItem을 생성하니 문제가 해결되었습니다.

    PHAsset은 아이폰 사진, 동영상과 같은 미디어 타입입니다. 사용자가 허용한 범위 내에서 미디어를 불러올 수 있습니다.

    import Photos
    import AVFoundation
    
    func requestAVAsset(from phAsset: PHAsset, completion: @escaping (AVAsset?) -> Void) {
        let options = PHVideoRequestOptions()
        options.deliveryMode = .highQualityFormat  // 품질 설정 옵션
        
        // PHImageManager를 통해 AVAsset 요청
        PHImageManager.default().requestAVAsset(forVideo: phAsset, options: options) { avAsset, audioMix, info in
            // 요청된 AVAsset을 completion handler로 전달
            DispatchQueue.main.async {
                completion(avAsset)
            }
        }
    }
    반응형

    댓글

Designed by Tistory.