개요
Swift에서 비디오 재생이 끝나는 시점을 감지하려면 먼저 비디오 플레이어를 생성한 후, 알림(Notification)을 활용해 재생이 중단되는 순간을 포착해야 합니다. 이 글에서는 실제 예제 코드를 통해 그 과정을 단계별로 살펴보겠습니다.
1. 프로젝트 준비하기
먼저 새로운 프로젝트를 생성하고, mp4 확장자를 가진 비디오 파일을 프로젝트에 드래그 앤 드롭으로 추가합니다. 이때 필요에 따라 'Copy items if needed' 옵션을 선택하고, 프로젝트 타겟에 반드시 포함시켜야 합니다.
2. 비디오 플레이어 생성 및 재생
이제 코드로 비디오 플레이어를 생성하고, 프로젝트 내 비디오 파일의 URL을 만든 뒤 영상을 재생해 보겠습니다.
var videoPlayer: AVPlayer!
다음 코드를 viewDidAppear 메서드에 추가합니다.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let filepath: String? = Bundle.main.path(forResource: "Introduction", ofType: "mp4")
if let videoPath = filepath {
let url = URL.init(fileURLWithPath: videoPath)
videoPlayer = AVPlayer(url: url)
let playerLayer = AVPlayerLayer(player: videoPlayer)
playerLayer.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer)
videoPlayer.play()
}
}위 코드는 비디오 플레이어를 생성한 뒤, 뷰 컨트롤러의 기본 뷰에 서브레이어(sublayer) 형태로 추가하는 역할을 합니다.
3. 재생 종료 알림 옵저버 등록
이제 플레이어에 옵저버(observer)를 등록하고, 비디오 재생이 끝났음을 감지했을 때 호출될 옵저버 메서드를 만들어야 합니다. 아래 코드 블록을 viewDidAppear 메서드에 추가하세요.
NotificationCenter.default.addObserver(self, selector: #selector(videoDidEnd), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
그다음 videoDidEnd 메서드를 작성합니다. 이 메서드 안에서는 원하는 어떤 동작이든 수행할 수 있습니다. 여기서는 비디오가 끝나고 노티피케이션 센터가 이 메서드를 호출할 때 콘솔에 "video ended"를 출력하도록 하겠습니다.
@objc func videoDidEnd(notification: NSNotification) {
print("video ended")
}코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.

비디오 재생이 끝나는 순간 콘솔에 아래와 같은 출력이 나타납니다.

4. 옵저버 해제로 메모리 효율성 높이기
위 코드만으로도 원하는 기능은 구현됩니다. 하지만 효율적인 메모리 사용을 위해서는 사용이 끝난 옵저버를 반드시 제거해 주는 것이 좋습니다. 아래 코드처럼 deinit에서 처리할 수 있습니다.
deinit {
NotificationCenter.default.removeObserver(self)
}마무리
정리하면, Swift에서 AVPlayer의 비디오 재생 종료를 감지하는 핵심은 AVPlayerItemDidPlayToEndTime 알림을 노티피케이션 센터에 등록하는 것입니다. 여기에 옵저버 해제까지 더하면 안전하고 깔끔하게 구현을 마칠 수 있습니다. 이 방식을 응용하면 재생 종료 후 다음 영상 자동 재생, 화면 전환, 광고 표시 등 다양한 기능을 손쉽게 확장할 수 있습니다.