【问题标题】:Play sound from Apple Watch speaker从 Apple Watch 扬声器播放声音
【发布时间】:2023-04-08 00:35:02
【问题描述】:

有没有办法通过 Apple Watch 的扬声器播放声音?我一直无法在网上找到任何文档。

【问题讨论】:

  • 谢谢!将其发布为答案,以便我验证
  • 等等,那个链接对我不起作用
  • 现在可以使用,他们的重定向有问题,您必须手动设置一个苹果论坛帐户,然后再次点击链接。
  • 需要开发者账号

标签: ios objective-c iphone audio apple-watch


【解决方案1】:

Apple Watch 的扬声器无法播放声音,但您可以在 iPhone 上触发播放声音文件,这里是thread 的介绍

【讨论】:

    【解决方案2】:

    从 watchOS 2 开始,现在可以使用 WKAudioFilePlayerWKInterfaceMovie

    NSURL *assetURL = [[NSBundle mainBundle] URLForResource:@"file" withExtension:@"wav"];
    

    WKAudioFilePlayer 示例:

    WKAudioFileAsset *asset = [WKAudioFileAsset assetWithURL:assetURL];
    WKAudioFilePlayerItem *playerItem = [WKAudioFilePlayerItem playerItemWithAsset:asset];
    WKAudioFilePlayer *audioFilePlayer = [WKAudioFilePlayer playerWithPlayerItem:playerItem];
    [audioFilePlayer play];
    

    WKInterfaceMovie 示例:

    [self presentMediaPlayerControllerWithURL:assetURL options:nil completion:nil];
    

    【讨论】:

    • 这其实不是问题的答案,因为sn-p不是通过手表的扬声器播放声音文件,而是通过配对的蓝牙耳机:“一个WatchKit扩展可能会启动扩展的播放通过配对的蓝牙音频耳机播放音频内容。” developer.apple.com/library/prerelease/watchos/documentation/…
    • @MichaelDorner 这不是真的“如果有可用的配对蓝牙耳机,媒体文件中的音频将路由到配对的蓝牙耳机。如果没有可用的蓝牙耳机,音频将路由到 Apple Watch 扬声器。”跨度>
    • 我用watchOS 2.0测试过,看不到这个路由。你做了什么?会很酷,如果这有效。 :-)
    • 请问如何在Watch App上实现流媒体播放?
    • 我这样做了,但手表扬声器没有任何声音。我不确定这是否有效。我在 watchos 3 上。
    【解决方案3】:
    • presentMediaPlayerControllerWithURL:options:completion: (watchOS 2.0 中的新功能)

    网址 您要播放的媒体文件的 URL。 URL 必须指定一个文件;不支持流媒体。该文件可能包含音频、视频或两者兼有。

    如果您为远程服务器上的文件指定 URL,此方法会首先下载文件并显示一个进度指示器来显示操作的进度。由于 WatchKit 在从 Web 服务器下载文件时使用 App Transport Security (ATS),因此文件必须位于安全服务器上,并且 URL 必须使用 https 方案。如果您的服务器不支持 ATS 级别的安全性,请在播放前自行下载文件。

    使用 sharedcontainer、watch 扩展来存储文件。

    您使用此方法播放的任何音频都会路由到已配对的蓝牙音频设备(如果可用)。如果没有可用的蓝牙音频设备,音频将被路由到 Apple Watch 扬声器。

    【讨论】:

    • 我正在尝试播放流媒体(收音机)。我的尝试失败了,并且收到了错误消息:App Transport Security (ATS)。如何播放流媒体广播?
    【解决方案4】:

    对于 WatchOS3,原始问题的答案是 WKInterfaceInlineMovie https://developer.apple.com/reference/watchkit/wkinterfaceinlinemovie

    您可以隐藏小部件,这样它就不会改变您的界面设计。如果没有连接蓝牙扬声器,它会通过手表的扬声器播放音频文件。

    【讨论】:

    • 知道为什么卷没有使用系统中的值吗?我在手表设置中将其设置为最低,但它的爆破声超级响亮。我也没有找到任何改变音量的参数。
    • 你知道如何隐藏小部件吗?
    • 与隐藏任何小部件相同:将小部件的 hidden 属性设置为 true/YES 或在 Interface Builder 中检查 hidden 属性。
    【解决方案5】:
    import AVFoundation
    var player: AVAudioPlayer?
    
    if let path = Bundle.main.path(forResource: "siren", ofType: "wav") {
    
            let fileUrl = URL(fileURLWithPath: path)
    
            do{
                try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
                try AVAudioSession.sharedInstance().setActive(true)
    
                player = try AVAudioPlayer(contentsOf: fileUrl)
    
                guard let player = player else { return }
    
                player.play()
    
            }
            catch
            {
    
            }
    
        }
    

    我用它来播放来自 Apple Watch(4.3) 扬声器的自定义声音,效果很好。 不要忘记将音频文件目标成员设置为手表套件。

    【讨论】:

    • 这对你来说适用于 watchOS 5 吗?它不适合我(不通过扬声器播放)
    • 手表操作系统模拟器可以使用扬声器吗?
    【解决方案6】:

    在 InterfaceController.swift 文件中

    在模拟器和设备中也能正常工作 在最新的 WatchOS 5 中可用

    import AVFoundation
    
    var player = AVAudioPlayer()
    let audioSession = AVAudioSession.sharedInstance()
    
    
        override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
        
        do {
            // Working Reroutes to headset
            //            try session.setCategory(AVAudioSession.Category.playback,
            //                                    mode: .default,
            //                                    policy: .longForm,
            //                                    options: [])
            
            // Plays in watch speaker
            try audioSession.setCategory(AVAudioSession.Category.playback,
                                    mode: .default,
                                    policy: .default,
                                    options: [])
        } catch let error {
            fatalError("*** Unable to set up the audio session: \(error.localizedDescription) ***")
        }
        if let path = Bundle.main.url(forResource: "piano", withExtension: "mp3") {
            let fileUrl = path
            do{
                player = try AVAudioPlayer(contentsOf: fileUrl)
            }
            catch
            {
                print("*** Unable to set up the audio player: \(error.localizedDescription) ***")
                // Handle the error here.
                return
            }
        }
    }
    

    使用此代码调用音频会话并在播放按钮操作中播放音频或在您希望播放音频的任何情况下播放音频。

         audioSession.activate(options: []) { (success, error) in
                guard error == nil else {
                    print("*** error occurred: \(error!.localizedDescription) 
                         ***")
                    // Handle the error here.
                    return
                }
                if(success){
                    // Play the audio file.
                    self.player.play()
                }
            }
    

    如果您仍然无法播放音频,那一定是因为您在音频文件中获得了 nil 值,指定的音频文件不会在您正在搜索的正确包中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      相关资源
      最近更新 更多