Extract audio from video file

前端 未结 2 1541
灰色年华
灰色年华 2021-01-01 03:06

How can I extrace Audio from Video file without using FFmpeg?

I want to use AVMutableComposition and AVURLAsset for solvi

2条回答
  •  别那么骄傲
    2021-01-01 03:58

    The following Swift 5 / iOS 12.3 code shows how to extract audio from a movie file (.mov) and convert it to an audio file (.m4a) by using AVURLAsset, AVMutableComposition and AVAssetExportSession:

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
    
        @IBAction func extractAudioAndExport(_ sender: UIButton) {
            // Create a composition
            let composition = AVMutableComposition()
            do {
                let sourceUrl = Bundle.main.url(forResource: "Movie", withExtension: "mov")!
                let asset = AVURLAsset(url: sourceUrl)
                guard let audioAssetTrack = asset.tracks(withMediaType: AVMediaType.audio).first else { return }
                guard let audioCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: kCMPersistentTrackID_Invalid) else { return }
                try audioCompositionTrack.insertTimeRange(audioAssetTrack.timeRange, of: audioAssetTrack, at: CMTime.zero)
            } catch {
                print(error)
            }
    
            // Get url for output
            let outputUrl = URL(fileURLWithPath: NSTemporaryDirectory() + "out.m4a")
            if FileManager.default.fileExists(atPath: outputUrl.path) {
                try? FileManager.default.removeItem(atPath: outputUrl.path)
            }
    
            // Create an export session
            let exportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetPassthrough)!
            exportSession.outputFileType = AVFileType.m4a
            exportSession.outputURL = outputUrl
    
            // Export file
            exportSession.exportAsynchronously {
                guard case exportSession.status = AVAssetExportSession.Status.completed else { return }
    
                DispatchQueue.main.async {
                    // Present a UIActivityViewController to share audio file
                    guard let outputURL = exportSession.outputURL else { return }
                    let activityViewController = UIActivityViewController(activityItems: [outputURL], applicationActivities: [])
                    self.present(activityViewController, animated: true, completion: nil)
                }
            }
        }
    
    }
    

提交回复
热议问题