从Apple Watch扬声器播放声音

14
有没有办法从Apple Watch的扬声器中播放声音?我在网上找不到任何文件。

1
不可能的,https://devforums.apple.com/thread/254687?tstart=0 - sheraza
1
谢谢! - frenchie4111
等一下,那个链接对我不起作用。 - frenchie4111
现在可以工作了,他们的重定向出了问题,你必须手动设置一个苹果论坛帐户,然后再次点击链接。 - frenchie4111
需要开发者账户。 - sheraza
对于WatchOS3,有一个新的小部件。请查看我的下面的回答。 - ghr
6个回答

16

使用WKAudioFilePlayerWKInterfaceMovie,自watchOS 2起现在可以实现。

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];

9
这实际上并不是问题的答案,因为这段代码片段并没有通过手表扬声器播放声音文件,而是通过配对的蓝牙耳机播放:“WatchKit扩展可以通过已配对的蓝牙音频耳机启动扩展音频内容的播放。” https://developer.apple.com/library/prerelease/watchos/documentation/General/Conceptual/AppleWatch2TransitionGuide/ManagingYourData.html#//apple_ref/doc/uid/TP40015234-CH12-SW6 - Michael Dorner
1
@MichaelDorner 这不是真的,“如果有配对的蓝牙耳机,则媒体文件中的音频会路由到蓝牙耳机。如果没有可用的蓝牙耳机,则音频会路由到Apple Watch扬声器。” - Ace Green
我已经在 watchOS 2.0 上进行了测试,但无法看到这个路由。你做了什么?如果能够运行就太棒了 :-) - Michael Dorner
请问,如何在手表应用程序上实现流媒体广播的播放? - Markus
我做了这个,但手表扬声器没有任何声音。我不确定这是否有效。我使用的是watchos 3。 - SolidSnake4444

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)的扬声器播放自定义音频,效果非常好。 不要忘记将音频文件的目标成员设置为Watch Kit。


这在你的watchOS 5上工作吗?对我来说它不起作用(无法通过扬声器播放)。 - wazawoo
1
演讲者是否可用于Watch OS模拟器? - kalpa

3

在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 值,指定的音频文件可能不在你正在搜索的正确 bundle 中。

3
  • presentMediaPlayerControllerWithURL:options:completion: (新增于watchOS 2.0)

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

如果您为远程服务器上的文件指定了URL,此方法会先下载文件,并显示进度指示器以显示操作的进度。因为WatchKit在从Web服务器下载文件时使用应用程序传输安全性(ATS),所以该文件必须位于安全服务器上,并且URL必须使用https方案。如果您的服务器不支持ATS级别安全,请在播放之前自行下载文件。

请使用共享容器、手表扩展来存储文件。

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


1
我正在尝试播放流媒体(广播)。但是我的尝试失败了,而且我还收到了错误消息:应用程序传输安全性(ATS)。我该如何播放流媒体广播? - Markus

3

有没有想法为什么音量没有使用系统中的值?我已经在手表设置中将其设置为最小,但它仍然非常响亮。我也没有找到任何更改音量的参数。 - Yonic Surny
你知道如何隐藏小部件吗? - Jesse Jin
与隐藏任何小部件相同:将小部件的hidden属性设置为true/YES或在Interface Builder中检查hidden属性。 - ghr

2

Apple Watch的扬声器无法播放声音,但您可以在iPhone上触发播放声音文件,这里有一个关于此的讨论


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接