본문 바로가기

개발 코딩 정보 공유/애플 iOS 스위프트 Xcode

오디오 플레이어 녹음 앱 만들기? 바로 시작 해보자

오디오플레이어를 개발해보자

소개

안녕하세요.

프로젝트를 진행하며 참고 내용을 공유 합니다.

오늘은 오디오 관련 음악파일을 재생, 녹음도 하는 그러한 앱을 만들어보겠습니다.

따로 open source를 쓰지는 않고 기본적인 AVFoundation 을 이용하도록 하겠습니다.

 

 

본문

 

AVFoundation 문서를 확인해보자

 

우선은 Play 부터 시작해보겠습니다.

첫번째는 음성녹음 ViewController 를 만들고 변수를 선언하겠습니다.

var aPlayer : AVAudioPlayer!
var playFile : URL!
var timer : Timer!

 

AVAudioPlayerURL 를 이용해서 작업해보도록 하겠습니다.

재생할 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) 은 위에서 작성한 sessioncategory를 변경하고 초기화 하는 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