2017-07-25 7 views
0

キューに入れられたオーディオファイルを再生するために、すばやく3でアプリを書きたいと思います。Mac - Swift 3 - オーディオファイルをキューに入れて再生する

私の最初の試みはAvAudioPlayerとAvAudioDelegate(AVAudioPlayer using array to queue audio files - Swift)を使用していましたが、ギャップを避けるために次の曲をプリロードする方法はわかりません。私はそれを行う方法を知っていても、私の目標を達成する最良の方法であるとは確信していません。 AVQueuePlayerは仕事のためのより良い候補者のようですが、それはその目的のために作られていますが、私を助けてくれる例はありません。 プリロードやバッファリングの問題に過ぎないのでしょうか?私は可能性のこの海で少し失われています。

どのような提案も歓迎されます。

+0

あなたがスムーズにオーディオファイルをクロスフェードない限り、常に波形がseamlesssly一致しないため亀裂、及び「ジャンプ」があるだろうが、スペクトルの高周波に対応します知覚される音のもちろん、オーディオファイルが最初に途切れない音の個々の断片に対応している場合、あなたは良いはずです... –

+0

これはオーディオファイルに変換されたMIDIコンポジションのサンプルです。彼らはすべて "0"で始まり "0"で終わります。検索を拡大することで、私は知事の解決策を見つけました。この投稿に基づいています:https://stackoverflow.com/questions/30479403/concatenate-two-audio-files-in-swift-and-play-them?rq=1。私はすぐにコードを公開します。 – Fredo

答えて

0

それははるかにあなたがそれを2回行いたい特別な場合は、完璧になることです以上(エラー「ファイルが存在」)が、それはベースとしての役割を果たすことができます。

何それは2つのファイルを取っているし(APの地雷がAIFされているサンプルは、4秒)、一つのファイルにそれらをエンコードし、結果のファイルを再生します。あなたが何百ものものを持っていれば、アレトリーリーでもなくても、それは楽しいことができます。

mergeAudioFiles関数のすべてのクレジットは@Peymanと@ Pigeon_39に送られます。 Concatenate two audio files in Swift and play them

スウィフト3

import Cocoa 
import AVFoundation 

var action = AVAudioPlayer() 
let path = Bundle.main.path(forResource: "audiofile1.aif", ofType:nil)! 
let url = URL(fileURLWithPath: path) 
let path2 = Bundle.main.path(forResource: "audiofile2.aif", ofType:nil)! 
let url2 = URL(fileURLWithPath: path2) 
let array1 = NSMutableArray(array: [url, url2]) 


class ViewController: NSViewController, AVAudioPlayerDelegate 
{ 

    @IBOutlet weak var LanceStop: NSButton! 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
    } 
    override var representedObject: Any? 
    { 
     didSet 
     { 
     // Update the view, if already loaded. 
     } 
    } 

    @IBAction func Lancer(_ sender: NSButton) 
    { 
     mergeAudioFiles(audioFileUrls: array1) 
     let url3 = NSURL(string: "/Users/ADDUSERNAMEHERE/Documents/FinalAudio.m4a") 

     do 
     { 
      action = try AVAudioPlayer(contentsOf: url3 as! URL) 
      action.delegate = self 
      action.numberOfLoops = 0 
      action.prepareToPlay() 
      action.volume = 1 
      action.play() 
     } 
     catch{print("error")} 

    } 


    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) 
    { 
     if flag == true 
     { 

     } 
    } 

    var mergeAudioURL = NSURL() 

    func mergeAudioFiles(audioFileUrls: NSArray) { 
     //audioFileUrls.adding(url) 
     //audioFileUrls.adding(url2) 
     let composition = AVMutableComposition() 

     for i in 0 ..< audioFileUrls.count { 

      let compositionAudioTrack :AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID()) 

      let asset = AVURLAsset(url: (audioFileUrls[i] as! NSURL) as URL) 

      let track = asset.tracks(withMediaType: AVMediaTypeAudio)[0] 

      let timeRange = CMTimeRange(start: CMTimeMake(0, 600), duration: track.timeRange.duration) 

      try! compositionAudioTrack.insertTimeRange(timeRange, of: track, at: composition.duration) 
     } 

     let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! as NSURL 
     self.mergeAudioURL = documentDirectoryURL.appendingPathComponent("FinalAudio.m4a")! as URL as NSURL 

     let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A) 
     assetExport?.outputFileType = AVFileTypeAppleM4A 
     assetExport?.outputURL = mergeAudioURL as URL 
     assetExport?.exportAsynchronously(completionHandler: 
      { 
       switch assetExport!.status 
       { 
       case AVAssetExportSessionStatus.failed: 
        print("failed \(assetExport?.error)") 
       case AVAssetExportSessionStatus.cancelled: 
        print("cancelled \(assetExport?.error)") 
       case AVAssetExportSessionStatus.unknown: 
        print("unknown\(assetExport?.error)") 
       case AVAssetExportSessionStatus.waiting: 
        print("waiting\(assetExport?.error)") 
       case AVAssetExportSessionStatus.exporting: 
        print("exporting\(assetExport?.error)") 
       default: 
        print("Audio Concatenation Complete") 
       } 
     }) 
    } 
} 
関連する問題