소개
안녕하세요.
프로젝트를 진행하며 참고 내용을 공유 합니다.
오늘은 오디오 관련 음악파일을 재생, 녹음도 하는 그러한 앱을 만들어보겠습니다.
따로 open source를 쓰지는 않고 기본적인 AVFoundation 을 이용하도록 하겠습니다.
본문
우선은 Play 부터 시작해보겠습니다.
첫번째는 음성녹음 ViewController 를 만들고 변수를 선언하겠습니다.
var aPlayer : AVAudioPlayer!
var playFile : URL!
var timer : Timer!
AVAudioPlayer 와 URL 를 이용해서 작업해보도록 하겠습니다.
재생할 mp3 파일을 가져와서 우리의 프로젝트 하위 경로에 넣어주도록 합니다.
playFile = Bundle.main.url(forResource: "sample_test", withExtension: "mp3")
Bundle.main.url 을 통해 해당 경로를 가져오도록 하겠습니다. 반드시 확장자도 붙혀주셔야 합니다.
그리고는 세션을 설정해 주겠습니다.
let aSession = AVAudioSession.sharedInstance()
do {
try aSession.setCategory(.playback, mode: .default)
try aSession.setActive(true)
} catch let error as NSError {
print(" aSession : \(error)")
}
session 의 경우 싱글턴 instance로 play , recording 이 같이 사용할 경우
상황에 맞게 Category를 변경해서 사용해야 합니다.
아래에서 자세히 알아보겠습니다.
do {
aPlayer = try AVAudioPlayer(contentsOf: playFile)
} catch let error as NSError {
print("\(error)")
}
aPlayer.delegate = self
aPlayer.prepareToPlay()
aPlayer.volume = 1.0
다음은 AVAudioPlayer 를 초기화 해주겠습니다. audioPlayer.delegate = self 를 보니
빠트린게 있군요.
class AudioViewController: AVAudioPlayerDelegate {
//...
}
delegate 구현도 빼놓지 않습니다.
play를 위한 기본적인 셋팅이 완료 되었습니다.
Storyboard 상에서 button 을 하나 만들고 클릭시 아래의 코드와 연결 시켜줍니다.
if sender.currentBackgroundImage?.accessibilityIdentifier == "play" {
initSession(.playback)
aPlayer.play()
playBtn.setBackgroundImage(UIImage(systemName: "pause"), for: .normal)
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updatePlay), userInfo: nil, repeats: true)
}else{
if(aPlayer.isPlaying){
aPlayer.pause()
playBtn.setBackgroundImage(UIImage(systemName: "play"), for: .normal)
}
}
play 버튼 하나로 pause 와 토글 할것이기 때문에 저는 위와 같이 작성하였습니다.
initSession(.playback) 은 위에서 작성한 session 의 category를 변경하고 초기화 하는 function을 말하는 것입니다.
playImgBtn 을 통해 버튼의 play, pause 등의 이미지를 변경하도록 하겠습니다.
그 아래에 보시면 progressTimer가 보입니다. timer를 지정하여 play 진행에 따라 시간을 업데이트 하도록 하겠습니다.
@objc
func updateTime(){
if(aPlayer.isPlaying){
print(" \(aPlayer.currentTime)")
}
}
마지막으로 delegate 설정 했던것을 기억하면서 audioPlayerDidFinishPlaying 함수를 구현합니다.
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
timer.invalidate()
aPlayer.currentTime = 0
playBtn.setBackgroundImage(UIImage(systemName: "play"), for: .normal)
print("play 종료")
}
이 부분에서는 play가 끝난후 정리하는 동작을 작성하면 되겠습니다.
이렇게 해서 간단한 오디오 player 기능이 완성되었습니다.
주의할점은
session 의 category 부분을 꼭 play에 맞게 셋팅해주셔야 하겠습니다.
- playback 으로 해주면 play - resume이 가능하고,
- playAndRecord 로 해주면play - resume이 불가능합니다.
글이 길어져서 다음글에서 recording 기능을 작성해 보겠습니다.
끝으로
AVFoundation 을 통해 간단하게 오디오 플레이어를 구현하였습니다.
오디오 관련 기능을 구현할때 참고가 되면 좋겠습니다
참고문서
https://developer.apple.com/documentation/avfoundation/audio_playback_recording_and_processing
'개발 코딩 정보 공유 > 애플 iOS 스위프트 Xcode' 카테고리의 다른 글
골치아픈 애플 개발자 법인등록에 대해서 알아보자 (0) | 2023.06.07 |
---|---|
오디오 플레이어 레코드 만들기 - 녹음 기능을 구현해보자 (0) | 2023.04.01 |
파이어베이스를 이용한 IOS 테스트 배포 (0) | 2023.03.05 |
IOS NavigationContorller를 활용한 화면 이동 방법 (0) | 2021.11.12 |
IOS 스토리보드로 ViewController를 이용한 화면 이동 하기 (0) | 2021.11.10 |