iOS Swift에서 AVPlayer를 활용한 동영상 재생 및 원하는 지점으로 이동하는 법.
AVPlayer :
a controller object used to manage the playback and timing of a media asset.
다양한 포맷의 동영상과 소리를 같이 재생해주는 동영상 재생 컨트롤러
Player 생성
url로 동영상을 받아올 수도 있고, 실제 파일을 지정해줄 수도 있다.
동영상 재생 컨트롤
func play() / func pause() / var rate: Float
동영상 시간 탐색
func currentTime() 은 현재 동영상 파일의 현재 재생 시간을 알려준다. (AVPlayer에 사용되는 시간들은 CMTime 형식)
원하는 지점 찾고 이동하기 Seeking Through Media
func seek(to: CMTime)
원하는 지점을 찾는 데에는 여러가지 방법이 있는데, 가장 정확하게 원하는 지점을 찾고 이동할 수 있는 방법은
func seek(to: CMTime, toleranceBefore: CMTime, toleranceAfter: CMTime) 이라고 한다.
CMTime이란??
AVPlayer에 사용되는 '시간'의 값은 CMTime 형식으로 표현이 되는데, 이 CMTime은 보통 다음과 같이 표현된다.
CMTime(value: CMTimeValue, timescale: CMTimeScale) 혹은
CMTime(seconds: Double, preferredTimescale: CMTimeScale)
CMTime은 이렇게 초를 나타내는 value(분자)와 시간의 단위를 나타내는 timescale(분모)로 시간을 표현한다.
예를 들어 CMTime(value: 120, timescale: 1)이면 120/1 = 2분을 나타내고
CMTime(value: 60, timescale: 600)이면 60/600 = 1/10 초를 나타낸다.
* 보통의 경우 timescale은 600으로 많이 설정을 하여 사용한다고 한다.
동영상의 초당 프레임 수(fps)는 보통 24프레임, 30프레임, 25프레임이 많이 사용되는데, timescale을 600으로 두면 이 경우들을 다 커버할 수 있기 때문에.
프레임 단위로 앞뒤 이동하는 법 How to play video frame by frame?
동영상에서 원하는 지점을 찾아 이동하는 방법에는 여러가지가 있는데, 프레임 단위로 가장 정확하게 찾고 이동하기 위해서 내가 사용한 방법은 CMTime의 내장 연산 메서드를 통해 동영상의 현재 시간에서 한 프레임당 시간을 계산하여 더하고 빼주어 seek(to: _, toleranceBefore: _, toleranceAfter: _)를 사용해 원하는 지점을 찾는 방법이다. (참고한 사이트: AVPlayer+Scrubbing)
var player: AVPlayer?
public func seekForward() {
let seconds = Double(1) / Double(fps)
let oneFrame = CMTime(seconds: seconds, preferredTimescale: 600)
let addTime = CMTimeAdd(currentTime, oneFrame)
player.seek(to: addTime, toleranceBefore: .zero, toleranceAfter: .zero)
}
public func seekBackward() {
let seconds = Double(1) / Double(fps)
let oneFrame = CMTime(seconds: seconds, preferredTimescale: 600)
let subtractTime = CMTimeSubtract(currentTime, oneFrame)
player.seek(to: subtractTime, toleranceBefore: .zero, toleranceAfter: .zero)
}
1. 한 프레임을 재생하는 데 걸리는 시간은 1초 / 초당 프레임 수 = seconds
2. 이를 CMTime 형식에 적용하면 timescale을 600으로 뒀을 때, 한 프레임당 재생 시간(초)은 seconds
3. CMTimeAdd 메서드를 통해 현재 시간에 한 프레임 재생 시간을 더해주고
4. 해당 시간을 정확하게 찾아 이동한다. (다음 프레임 혹은 이전 프레임으로)
+
총 재생 시간
현재 재생 시간
초당 프레임 수
총 프레임
원하는 프레임으로 이동하기
'Swift iOS 앱 개발 > 실전 Swift' 카테고리의 다른 글
[Swift iOS] UICollectionView - Storyboard (0) | 2022.06.15 |
---|---|
Volumetric Internal Project (0) | 2021.01.21 |
[실전 Swift] Disable multiple touch on UICollectionView 다중 터치 방지 (0) | 2021.01.18 |
[실전 Swift] How to update UI? (0) | 2021.01.12 |
[실전] Swift Add toggle button using UIButton() 버튼 만들기 (0) | 2021.01.12 |