[swift] 사운드 편집 기능 구현하기

사운드 편집 기능은 많은 앱에서 사용되고 있으며, 사용자가 오디오 파일을 잘라내거나 재생 속도를 조절하는 등의 작업을 수행할 수 있도록 도와줍니다. 이번 블로그 포스트에서는 Swift를 사용하여 사운드 편집 기능을 구현하는 방법을 알아보겠습니다.

1. AVFoundation 프레임워크 사용하기

사운드 편집을 위해 AVFoundation 프레임워크를 사용할 것입니다. AVFoundation은 오디오와 비디오 미디어 처리를 위한 Apple의 프레임워크로, 다양한 기능을 제공하며 오디오 파일을 편집하고 조작하는 데 사용될 수 있습니다.

먼저, 프로젝트에 AVFoundation 프레임워크를 추가해야 합니다. Xcode에서 프로젝트를 선택한 후, “Build Phases” 탭을 열고 “Link Binary With Libraries” 섹션에서 “+” 버튼을 클릭한 후, AVFoundation.framework을 선택합니다.

2. 사운드 파일 불러오기

편집할 사운드 파일을 앱에 불러와야 합니다. 이를 위해 AVAudioPlayer 클래스를 사용할 수 있습니다. AVAudioPlayer 인스턴스를 생성하고, 파일의 경로를 전달하여 사운드 파일을 로드합니다.

import AVFoundation

let soundURL = Bundle.main.url(forResource: "sound", withExtension: "mp3")!

do {
    let audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
    audioPlayer.prepareToPlay()
    audioPlayer.play()
} catch {
    print("Error loading sound file: \(error.localizedDescription)")
}

3. 사운드 파일 편집하기

사운드 파일을 편집하기 위해서는 AVAudioEngine을 사용할 수 있습니다. AVAudioEngine은 오디오 노드를 연결하고 처리하는 역할을 수행합니다.

예를 들어, 오디오 파일을 잘라내고 싶다면 AVAudioFile 객체를 사용할 수 있습니다. 다음은 오디오 파일의 일부를 잘라내는 예시 코드입니다.

let audioFileURL = Bundle.main.url(forResource: "sound", withExtension: "mp3")!
let audioFile = try AVAudioFile(forReading: audioFileURL)

let startTime = AVAudioTime(sampleTime: 0, atRate: audioFile.fileFormat.sampleRate)

let duration = AVAudioTime(seconds: 5, sampleRate: audioFile.fileFormat.sampleRate)
let endTime = startTime + duration

let outputFileURL = /* 저장할 파일 경로 설정 */

let outputFile = try AVAudioFile(forWriting: outputFileURL, settings: audioFile.fileFormat.settings)

try audioEngine.renderToFile(outputFile, from: startTime, to: endTime)

위 코드에서 audioFileURL은 원본 오디오 파일의 URL이고, outputFileURL은 잘라낸 부분을 저장할 파일의 URL입니다. startTimeduration을 통해 잘라낼 부분을 설정하고, audioEngine.renderToFile(_:from:to:) 메서드를 사용하여 잘라낸 부분을 출력 파일에 저장합니다.

4. 사운드 편집 기능 조합하기

위에서 알아본 기능들을 조합하여 원하는 사운드 편집 기능을 구현할 수 있습니다. 예를 들어, 재생 속도를 조절하고자 한다면 AVAudioUnitTimePitch를 사용할 수 있습니다.

let audioFileURL = Bundle.main.url(forResource: "sound", withExtension: "mp3")!
let audioFile = try AVAudioFile(forReading: audioFileURL)

let audioEngine = AVAudioEngine()
let playerNode = AVAudioPlayerNode()
let pitchUnit = AVAudioUnitTimePitch()

audioEngine.attach(playerNode)
audioEngine.attach(pitchUnit)
audioEngine.connect(playerNode, to: pitchUnit, format: audioFile.processingFormat)
audioEngine.connect(pitchUnit, to: audioEngine.mainMixerNode, format: audioFile.processingFormat)

playerNode.play()

pitchUnit.pitch = 1000 // 재생 속도 조절 (양수: 빠르게 재생, 음수: 느리게 재생)

try audioEngine.start()

위 코드에서 pitchUnit.pitch를 설정하여 재생 속도를 조절할 수 있습니다. 양수 값은 빠른 재생을, 음수 값은 느린 재생을 의미합니다.

이처럼 AVFoundation 프레임워크를 사용하여 사운드 편집 기능을 구현할 수 있습니다. 해당 기능은 오디오 파일을 재생하고, 자르고, 조작하는 등의 다양한 작업을 수행할 수 있어 다양한 앱에서 활용될 수 있습니다.

참고 자료