2017-06-28 38 views
0

目標:我需要循環播放音頻文件的任意切片。使用AVFoundation類播放的音頻文件的參考部分

目前的解決方案:使用MPMusicPlayerController :: systemMusicPlayer和定時器

  • 一可行的解​​決方案。這基本上工作,但有幾個問題。首先,在改變切片的位置/持續時間的某個時刻,UI將鎖定(具體地,觸摸輸入)。奇怪的是,它會在執行完所有代碼之後發生1秒,但由於我無法控制其中的大部分代碼,因此我最終認爲它不是一個可行的解決方案。
  • 第二個解決方案目前使用相同的基本設置,除了我使用AVFoundation :: AVAudioPlayer。我只開始實施,但我已經注意到這種循環是相當不一致的。

我目前處於第二個解決方案循環的地步,但還沒有到達測試UI是否鎖定的地步。

問題:我一直在尋找通過AVFoundation可用的方法和有想法:「這將有可能引用的音頻文件和環路,改變塊需要的精確塊」 。我找不到,我認爲這可能是由於我缺乏正確搜索它的術語,是這類事情的任何例子。

如果可能,我想使用內置框架。

回答

0

終於找到一些很好的例子後,我想出了:

let composition = AVMutableComposition() 
var playerItem:AVPlayerItem! 
var qPlayer:AVQueuePlayer! 
var currentAudioTrack:AVAssetTrack! 
var compAudioTrack:AVMutableCompositionTrack! 
var uurl:URL! 
var asset:AVURLAsset! 

...

do { 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers) 
    } catch let error { 
     print("i am error:", error) 
    } 
    compAudioTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID()) 
    uurl = (sysMusicPlayer.nowPlayingItem?.assetURL)! 
    asset = AVURLAsset(url: uurl) 
    currentAudioTrack = asset.tracks(withMediaType: AVMediaTypeAudio)[0] 
    assetTimeScale = currentAudioTrack.naturalTimeScale 
    let a:CMTime = CMTime(seconds: 10, preferredTimescale: assetTimeScale) 
    let b:CMTime = CMTime(seconds: 42, preferredTimescale: assetTimeScale) 
    try! compAudioTrack.insertTimeRange(CMTimeRange(start: a, end: b), of: currentAudioTrack, at: CMTimeMake(0, 1)) 
    playerItem = AVPlayerItem(asset: composition) 
    qPlayer = AVQueuePlayer(playerItem: playerItem) 
    qPlayer.play() 

這是最基本的功能,它可以讓我failr輕易改變歌曲的當前部分通過

compAudioTrack.segments.removeAll() 
    try! compAudioTrack.insertTimeRange(timeRangeToInsert, of: currentAudioTrack, at: CMTimeMake(0, 1)) 
    qPlayer.insert(playerItem, after: nil)