【问题标题】:AVPlayer plays on simulator but doesn't on a real deviceAVPlayer 在模拟器上播放,但不在真实设备上
【发布时间】:2013-07-11 02:57:24
【问题描述】:

我正在实现一个基本的音频播放器来播放远程音频文件。文件为 mp3 格式。 我编写的代码在模拟器上运行良好,但在真实设备上无法运行。但是,如果我通过使用 safari(在同一台真实设备上)加载它,我在我的应用程序中使用的相同 url 可以正常工作,所以我并没有真正理解缺失的点。 以下是我的代码:

self.musicPlayer = [AVPlayer playerWithURL:[NSURL URLWithString:urlTrack]];
[self.musicPlayer play];

非常简单的事情。音乐播放器属性定义为

@property (nonatomic, retain) AVPlayer *musicPlayer;

我也尝试过使用 AVPlayerItem,但结果是一样的。这是我使用的代码

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:urlTrack]];
self.musicPlayer = [AVPlayer playerWithPlayerItem:playerItem];
[self.musicPlayer play];

最后我尝试使用下面的代码

self.musicPlayer = [AVPlayer playerWithURL:[NSURL URLWithString:urlTrack]];
NSLog(@"Player created:%d",self.musicPlayer.status);
[self.musicPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSLog(@"Player created:%d",self.musicPlayer.status);

    if (object == self.musicPlayer && [keyPath isEqualToString:@"status"]) {
        if (self.musicPlayer.status == AVPlayerStatusReadyToPlay) {
            [self.musicPlayer play];
        } else if (self.musicPlayer.status == AVPlayerStatusFailed) {
            // something went wrong
        }
    }
}

当调用observeValueForKeyPath方法时,播放器状态为1,播放已执行,但仍然没有声音。 我尝试了几个文件,例如:

http://www.nimh.nih.gov/audio/neurogenesis.mp3

http://www.robtowns.com/music/blind_willie.mp3

有什么想法吗? 天呐

【问题讨论】:

    标签: objective-c avplayer


    【解决方案1】:

    检查文件名的拼写。设备区分大小写,模拟器不...

    另外,请检查您的铃声是否关闭,关闭时您将听不到任何声音。为了防止这种情况,使用

    NSError *_error = nil;
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &_error];
    

    就在你启动播放器之前

    【讨论】:

    • 我按照您的建议进行了尝试,在我的播放器初始化之前添加了这两行,没有问题。现在,我尝试使用我的个人 iPhone 和与 iPad 不同的网络以及我面临这个问题的网络。至少我可以说代码工作正常。我将在我正在使用的 iPad 上进行相同的测试。但我不明白为什么,当我在我用于开发的这台 iPad 上尝试相同的代码时,它不起作用但相同的 mp3 url 在 safari 上尝试(总是在 iPad 上)。
    • 我想我找到了——你没有分配你的播放器,所以它马上就被释放了。试试self.musicPlayer = [[AVPlayer alloc] initWithContentsOfURL: [NSURL URLWithString:urlTrack]]; - 另外,在[self. musicPlayer play] 之前添加[self.musicPlayer prepareToPlay]
    • 问题已通过您发布的我在代码中遗漏的行解决。通过添加它,它工作正常。 Tnx :)
    • 我的铃声已关闭!呸呸呸!我想要两个小时的生命回来。
    【解决方案2】:

    我已经尝试了所有的东西但没有用,唯一认为对我有用AVAudioSessionplayBack
    这是我使用的代码

    private var audioPlayer: AVAudioPlayer!
    
    guard let path = Bundle.main.path(forResource: name, ofType: "mp3") else {
            print("can not find path")
            return
        }
        let url = URL(fileURLWithPath: path)
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback)
            audioPlayer = try AVAudioPlayer(contentsOf: url)
        } catch {
            print("some thing went wrong: \(error)")
        }
        audioPlayer!.prepareToPlay()
        audioPlayer!.play()
    

    请不要忽略上面代码中的那一行
    try AVAudioSession.sharedInstance().setCategory(.playback)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2016-05-29
      • 2011-02-07
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多