[swift] 동영상에서 오디오 추출하여 재생하기

Swift를 사용하여 동영상에서 오디오를 추출하고 재생하는 방법을 알아보겠습니다.

1. AVFoundation 프레임워크 import하기

오디오를 추출하기 위해 AVFoundation 프레임워크를 import해야 합니다. 아래와 같이 코드를 작성하여 import할 수 있습니다.

import AVFoundation

2. AVAsset 생성하기

동영상에서 오디오를 추출하기 위해 AVAsset을 생성해야 합니다. AVAsset은 동영상 또는 오디오 파일을 나타냅니다. 아래와 같이 코드를 작성하여 AVAsset을 생성합니다.

let videoURL = URL(fileURLWithPath: "video.mp4")
let asset = AVAsset(url: videoURL)

3. AVAsset에서 오디오 추출하기

AVAsset에서 오디오를 추출하기 위해 AVAssetTrack을 가져와야 합니다. AVAssetTrack은 오디오 또는 비디오 트랙을 나타냅니다. 아래와 같이 코드를 작성하여 오디오 트랙을 가져옵니다.

let audioTracks = asset.tracks(withMediaType: .audio)

4. AVAssetTrack에서 오디오 데이터 추출하기

오디오 데이터를 추출하기 위해 AVAssetReader와 AVAssetReaderTrackOutput을 사용합니다. 아래와 같이 코드를 작성하여 오디오 데이터를 추출합니다.

let assetReader = try! AVAssetReader(asset: asset)
let trackOutput = AVAssetReaderTrackOutput(track: audioTracks.first!, outputSettings: nil)
assetReader.add(trackOutput)
assetReader.startReading()

var audioData = Data()
while let sampleBuffer = trackOutput.copyNextSampleBuffer() {
    if let blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer) {
        var bufferLength = 0
        var bufferData: UnsafeMutablePointer<Int8>?
        CMBlockBufferGetDataPointer(blockBuffer, atOffset: 0, lengthAtOffsetOut: nil, totalLengthOut: &bufferLength, dataPointerOut: &bufferData)
        let data = NSData(bytes: bufferData, length: bufferLength)
        audioData.append(data as Data)
    }
}

5. 오디오 재생하기

오디오 데이터를 추출한 후, AVAudioPlayer를 사용하여 오디오를 재생할 수 있습니다. 아래와 같이 코드를 작성하여 오디오를 재생합니다.

let audioPlayer = try! AVAudioPlayer(data: audioData)
audioPlayer.play()

전체 코드 예시

import AVFoundation

let videoURL = URL(fileURLWithPath: "video.mp4")
let asset = AVAsset(url: videoURL)
let audioTracks = asset.tracks(withMediaType: .audio)

let assetReader = try! AVAssetReader(asset: asset)
let trackOutput = AVAssetReaderTrackOutput(track: audioTracks.first!, outputSettings: nil)
assetReader.add(trackOutput)
assetReader.startReading()

var audioData = Data()
while let sampleBuffer = trackOutput.copyNextSampleBuffer() {
    if let blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer) {
        var bufferLength = 0
        var bufferData: UnsafeMutablePointer<Int8>?
        CMBlockBufferGetDataPointer(blockBuffer, atOffset: 0, lengthAtOffsetOut: nil, totalLengthOut: &bufferLength, dataPointerOut: &bufferData)
        let data = NSData(bytes: bufferData, length: bufferLength)
        audioData.append(data as Data)
    }
}

let audioPlayer = try! AVAudioPlayer(data: audioData)
audioPlayer.play()

위와 같이 코드를 작성하면 동영상에서 오디오를 추출하여 재생할 수 있습니다.

참고 자료