ios - 使用 AVFoundation 类播放音频文件的引用部分

标签 ios swift audio avfoundation

目标:我需要循环播放音频文件中不断变化的任意片段。

当前解决方案:

  • 第一个工作解决方案使用 MPMusicPlayerController::systemMusicPlayer 和计时器。这基本上有效,但有一些问题。首先,在更改切片的位置/持续时间的某个时刻,UI 将锁定(特别是触摸输入)。奇怪的是,它会在我的所有代码执行后大约 1 秒发生,但由于我无法控制其中的很多代码,我最终将其归结为这不是一个可行的解决方案。
  • 第二个解决方案当前使用相同的基本设置,除了我使用 AVFoundation::AVAudioPlayer。我才刚刚开始实现,但我已经注意到该循环相当不一致。

我目前正处于第二个解决方案循环的阶段,但还没有达到可以测试 UI 是否锁定的程度。

问题:我在查看 AVFoundation 中的可用方法时想到:“是否可以引用音频文件的确切 block 并循环播放,根据需要更改 block ?”。我找不到类似这样的示例,我认为这可能是由于我缺乏正确搜索它的术语。

如果可能的话,我想使用内置框架。

最佳答案

最终找到一些很好的例子后,我想出了:

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()

这是基本功能,它可以让我轻松更改歌曲的当前部分

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

关于ios - 使用 AVFoundation 类播放音频文件的引用部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44813653/

相关文章:

ios - MKMarkerAnnotationView 在 iPhone X 上不显示

iphone - 如何在 iPhone 接收音频流时从 Wi-Fi 更改为 3G?

ios - 如何用swift在折线图中显示json数据

ios - UITableView reloadSection 导致缺少显示的单元格

ios - 不同类中的委托(delegate)和数据源可能吗? - UITableView

python - 如何在有声读物网站上捕获mp3文件的请求URL?

java - android studio 改变 API<23 的音频播放速度

ios - 尝试使用 react-native 在 ios 上安装 "@intercom/intercom-react-native"时出错

ios - 禁用 iPhone 共享表中的 "more"按钮

ios - XLPagerTabStrip - 如何添加 UISearchController