magazine off

avfoundationを使って音声ファイルのトリミング

投稿日 : 2017年7月13日(木曜日)

説明

swift3を使って音声ファイルをトリミングしてみます。およそ4分程度の音声ファイルのうち5秒〜15秒の間だけ切り取るところまでをやっていきます。AVFoundationは覚えることが多く、使い方も面倒臭く、リファレンスを読むだけでは掴みづらい感じがあります。なので良いソースコードを見つけていじるのが良いですね。下記に参照元を貼っておきます。

10715a2dc086df6d3fa8aa37a4d5417d.png

実装

import UIKit
import AVFoundation


class ViewController: UIViewController {

    var asset: AVAsset?

    func createAudioFileFromAsset(_ asset: AVAsset){
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
        let filePath = documentsDirectory.appendingPathComponent("rendered-audio.m4a")
     if let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A){
            exportSession.canPerformMultiplePassesOverSourceMediaData = true
            exportSession.outputURL = filePath
            exportSession.outputFileType = AVFileTypeAppleM4A
            exportSession.exportAsynchronously {
                _ in
                print("finished: \(filePath) :  \(exportSession.status.rawValue) ")
            }
        }
    }


    @IBAction func exportBtnDidTap(_ sender: Any) {
        guard let asset = asset else {
            return
        }
        createAudioFileFromAsset(asset)
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        let audioAsset = AVURLAsset(url: Bundle.main.url(forResource: "LoveYourself", withExtension: "mp3")!)
        let comp = AVMutableComposition()
        let audioAssetSourceTrack = audioAsset.tracks(withMediaType: AVMediaTypeAudio).first! as AVAssetTrack
        let audioCompositionTrack = comp.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)

        do {
            try audioCompositionTrack.insertTimeRange(
                CMTimeRangeMake(CMTimeMakeWithSeconds(5, 100000), CMTimeMakeWithSeconds(15, 100000)),
                of: audioAssetSourceTrack,
                at: kCMTimeZero)
        }
        catch { print(error) }
        asset = comp

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

参考

justinlevi/AVAssetExportSession_AVMutableComposition

ソース

github

Categories

Recent Posts

mongoで最新の三つのデータだけ確認したい

  $ mongo > use DB名; > db.テーブル名.find(…

投稿日 : 2019年10月27日(日曜日)

ドナルド・トランプに学ぶ!成功を掴む四つの哲学

 ドナルド・トランプに学ぶ!成功を掴む四つの哲学 https://youtu.b…

投稿日 : 2020年12月13日(日曜日)

Twitter、ついに仮想通貨での送金やNFT認証の導入始める。革命的!個人間取引の未来

   Twitter、ついに仮想通貨送金やNFT認証の導入始める。革命…

投稿日 : 2021年10月1日(金曜日)

チーム開発をより建設的にする「朝の会議」でシェアすること、しないこと

     ソフトウェア開発の現場でプロジェクトのマネジ…

投稿日 : 2021年5月27日(木曜日)