【问题标题】:IOS 8 Swift AVAudioPlayer play remote audio (wowza server)IOS 8 Swift AVAudioPlayer 播放远程音频(wowza 服务器)
【发布时间】:2014-11-12 05:14:39
【问题描述】:

我不是 IOS 程序员,但我需要一个简单的应用程序来播放来自 wowza 服务器的音频流。这是我的代码,我没有错误,但也没有音频。有什么指导或帮助吗?

    import UIKit
    import AVFoundation

    class ViewController: UIViewController {

         var player = AVAudioPlayer()

        override func viewDidLoad() {
            super.viewDidLoad()

            var fileURL: NSURL = NSURL(string: "http://url----.com/playlist.m3u8")

            var error:NSError?
            player = AVAudioPlayer(contentsOfURL: fileURL, error: &error)

            if player.prepareToPlay() && player.play(){
                println("yes")
            } else {
                println("no")
            }
        }

【问题讨论】:

  • 您没有检查error是否包含错误。
  • 如何检查?
  • @Raptor AVAudioPlayer 不支持流式传输。对于直播使用 AVPlayer

标签: ios swift ios8 avaudioplayer


【解决方案1】:

这个anwser帮助了我:AVAudioPlayer with external URL to *.m4p

我必须将 thr URL 转换为 NSData:

func musicFromURL(streamURL: String) {
    guard let fileURL = URL(string:streamURL) else { return  }
    do {
        let soundData = try Data(contentsOf: fileURL)
        self.audioPlayer = try AVAudioPlayer(data: soundData)
        guard let audioPlayer = audioPlayer else { return }
        audioPlayer.prepareToPlay()
        audioPlayer.volume = 1.0
        audioPlayer.play()
    } catch {
        print(error)
    }
}

【讨论】:

  • 请记住,此选项涉及下载 mp3 然后播放。使用 AVPlayer,您实际上可以流式传输它。
  • 这是唯一适用于 Swift 5 / iOS 14 的答案。上面的代码确实存在问题,我进行了一些修改以使其与 iOS 14 兼容。主要问题是编辑的是它仍然不是一个异步解决方案,所以在音频播放之前会有延迟。
  • @FontFamily 这个解决方案会在播放前完全下载文件。记在心上。 AvPlayer 可以流式传输文件,仅下载要播放的文件的一部分。这将根据音频文件的大小显着加快播放速度。
【解决方案2】:

//全局创建AVPlayer实例

var avPlayer:AVPlayer!


override func viewDidLoad() {
    super.viewDidLoad()
    let urlString = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"
    let url = NSURL(string: urlString)!
    avPlayer = AVPlayer(url: url as URL)

    print("About to play...")
    avPlayer.play()
   print("isplaying")
}

【讨论】:

    【解决方案3】:

    Swift 2.0iOS 9

    do {
        let url = "http://yourdomain.com/file.mp3"
        let fileURL = NSURL(string:url)
        let soundData = NSData(contentsOfURL:fileURL!)
        self.audioPlayer = try AVAudioPlayer(data: soundData!)
        audioPlayer.prepareToPlay()
        audioPlayer.volume = 1.0
        audioPlayer.delegate = self
        audioPlayer.play()
    } catch {
        print("Error getting the audio file")
    }
    

    【讨论】:

      【解决方案4】:

      自 iOS 9 起请记住: 已配置应用传输安全 (ATS)?

      <key>NSAppTransportSecurity</key>
      <dict>
         <key>NSExceptionDomains</key>
         <dict>
            <key>yourserver.com</key>
            <dict>
               <!--Include to allow subdomains-->
               <key>NSIncludesSubdomains</key>
               <true/>
               <!--Include to allow HTTP requests-->
               <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
               <true/>
               <!--Include to specify minimum TLS version-->
               <key>NSTemporaryExceptionMinimumTLSVersion</key>
               <string>TLSv1.1</string>
            </dict>
         </dict>
      </dict>
      

      斯威夫特 2:

      let url = "http://yourserver.com/source.mp3"
          let playerItem = AVPlayerItem(URL:NSURL(string:url)!)
          audio = AVPlayer(playerItem:playerItem)
          audio.rate = 1.0;
          audio.play()
      

      【讨论】:

        【解决方案5】:

        这对我有用:

        var player = AVPlayer()
        
        func configureView() {
        
            let url = "http://stream.your.url.com"
            let playerItem = AVPlayerItem( URL:NSURL( string:url ) )
            player = AVPlayer(playerItem:playerItem)
            player.rate = 1.0;
            player.play()
        
        }
        

        【讨论】:

        • 如果你直接用这样的 url 创建 'AVPlayer' 它也可以工作:'avPlayer = AVPlayer(URL: nsUrl)' 如果你将 avPlayer 创建为本地,你唯一应该做的就是创建 avPlayer 作为实例变量变量它对我不起作用。
        • 不错!在我创建 AVPlayer 作为实例变量后,它开始播放!
        • 如果我的网址正确且互联网可用,avPlayer.play() 是否保证我的音频会播放?是否有任何尝试知道 play() 是否成功?
        • 另外,它的播放确实有一点延迟。我怎样才能在那个时候显示一些加载指示器?
        • 这在 iOS 14.5 / Swift 5.2+ 中不起作用
        【解决方案6】:

        使用 AVPlayer:

        var player:AVPlayer!
        var steamingURL:NSURL = NSURL(string:playerURL)
        player = AVPlayer(URL: steamingURL)
        player.play()
        

        【讨论】:

        • @DavidTurton 但是这段代码在我当前的项目中运行良好。所以再试一次
        • 你能告诉我你在哪里启动变量 playerURL,也许我做错了什么?
        • 也试过了,但不能用于流式传输文件,还有其他建议吗?
        • @edse 测试设备
        • 我导入了 Avfoundation 并在 iPhone 上进行了测试,但不播放音频。我检查了设备也没有处于静音模式。
        【解决方案7】:

        要在 Swift 中检查错误,请使用:

        if let errorDetails = error {
            println("Error creating player: \(errorDetails.localizedDescription)")
        } else {
            if player.prepareToPlay() && player.play(){
                println("yes")
            } else {
                println("no")
            }
        }
        

        【讨论】:

        • 创建播放器时出错:操作无法完成。 (OSStatus 错误 2003334207。)。
        • 错误2003334207 表示AVAudioPlayer 需要本地文件。从 Internet 下载并在播放前将其保存到本地。提示:使用writeToFile
        猜你喜欢
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多