ios - AvQueuePlayer 不在 iPhone 上播放音频,只能在模拟器上工作

标签 ios swift audio avfoundation avqueueplayer

我已将音频文件添加到我的 Xcode 项目中,以便我可以使用 AvQueuePlayer(AVPlayer 的子类)在本地播放它们。为了做到这一点,我必须创建一个 [AVPlayerItems] 数组,然后将其提供给 AVQueuePlayer 以按顺序播放...这是我的代码...

override func viewDidLoad() {

//fills songNameArray with the appropriate part of file name, example: print(songNameArray[0]) -> prints -> "SongName.mp3"
   let path = NSBundle.mainBundle().resourcePath!
  let songFiles = try! NSFileManager.defaultManager().contentsOfDirectoryAtPath(path)
    for item in songFiles {
        if item.hasSuffix("mp3") {
            songNameArray.append(item)
            print("appended to songNameArray \(item)")
        }
    }

 //iterates thru songNameArray and uses combineStrings method to form fullSongPath//
    for i in 0...songNameArray.count - 1 {
        fullSongPaths.append(combineStrings(songNameArray[i]))
        print("here are the full song paths \(fullSongPaths[i])")
    }

 func combineStrings(songName: String) -> String {
    let fullSongPath = ("/Users/username/Desktop/Xcode Projects Folder/LocalAudioPlayer/LocalAudioPlayer/" + songName)
    return fullSongPath
    }
}

然后,这是我的 didSelectRowAtIndexPath,用户点击歌曲即可开始播放...

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

      makePlayerItemsArray()

      queuePlayer = AVQueuePlayer(items: playerItemsArray)
      queuePlayer?.play()
  }

这是 makePlayerItemsArray 函数...

    func makePlayerItemsArray () {
       playerItemsArray.removeAll()

       var createdURL = NSURL()
       var createdItem = AVPlayerItem(URL: createdURL)

       for i in 0...fullSongPaths.count - 1 {
           createdURL = NSURL.fileURLWithPath(fullSongPaths[i])
           createdItem = AVPlayerItem(URL: createdURL)
           playerItemsArray.append(createdItem)
       }
   }

这一切在计算机上完美运行,点击一行后音频几乎立即开始播放。问题是当我在 iPhone 上运行此程序时没有音频输出。这首歌永远不会开始播放。而且,在 iPhone 上运行时,如果我点击一行,然后等待几秒钟,然后点击一个调用 queuePlayer.currentItem.currentTime() 的按钮,-- 应用程序会在该行崩溃,我认为这是由于 queuePlayer 没有任何项目可以播放。

但是,为什么当我在手机上运行它时,queuePlayer 无法从 playerItemsArray 获取项目?...我能够打印出fullSongPaths 数组以及 playerItemsArray 的内容,但queuePlayer不会播放它们...

最佳答案

问题是这一行:

let fullSongPath = ("/Users/username/Desktop/Xcode Projects Folder/LocalAudioPlayer/LocalAudioPlayer/" + songName)

当您使用手机时,您无法播放计算机桌面上的歌曲文件。

令我惊讶的是这在模拟器上有效,事实上它确实可以被合理地认为是一个错误。

这些文件需要app bundle本身中(这样当你在那里构建和运行它时,它们会作为应用程序的一部分复制到手机上),并且您需要通过它们的 URL 将它们作为应用程序包中的资源引用(也就是说,纯粹相对于应用程序包,因为它的 URL 并不重要并且可以更改)。

关于ios - AvQueuePlayer 不在 iPhone 上播放音频,只能在模拟器上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34885878/

相关文章:

ios - ASIHTTPRequest 缓存不工作

iOS、Cocoa、AppiRater - 如何本地化 SKStoreProductViewController 的取消按钮

ios - UINavigationController 在 popViewControllerAnimated 之后不释放/销毁 Controller ?

ios - 关于 UnsafeMutablePointer 的 destroy() 的术语

delphi - 如何从声卡录制任何东西?

android - 当应用程序不在 Play 商店或应用商店时,如何自动将 Flutter Mobile 应用程序更新到较新版本?

swift - 如何在 swift 中从 xib/nib 在启动(显示)窗口中执行代码

ios - 带有 UIButton 的 SWReveal

c# - 如何判断主音量是否静音?

c# - 将wav文件转换为单声道