【问题标题】:AVAssetReader kills playback (in AVAudioPlayer)AVAssetReader 终止播放(在 AVAudioPlayer 中)
【发布时间】:2011-11-16 17:29:12
【问题描述】:

我正在使用 AVAssetReader 读取 ipod 库资产音频数据并渲染波形图像。这是使用我在对this question的回答中描述的代码进行的

这有时会在 AVAudioPlayer 实例播放音频时发生。

无论正在播放的音频是否与正在阅读的资产相同,我点击的那一刻

[reader startReading];

正在播放的音频“淡出”。 (好像 AVAudioPlayer 以某种方式被告知停止播放)。这很奇怪,因为我实际上并没有播放音频,只是阅读它。

我在 SO 上进行了搜索,发现 this possible solution 但是我发现这似乎无法解决问题。

注意 - 我可以播放多个 AVAudioPlayer 实例,并且启动这些实例似乎不会相互干扰 - 但是

[reader startReading];

甚至会杀死多个同时出现的 AVAudioPlayer 实例,导致它们全部同步淡出。

有什么想法吗?

【问题讨论】:

    标签: avaudioplayer


    【解决方案1】:

    回答我自己的问题....

    进一步搜索 SO 导致我实施了这个替代解决方案:

    - (void)setupAudio {
        [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
        UInt32 doSetProperty = 1;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
        [[AVAudioSession sharedInstance] setActive: YES error: nil];
    }
    

    这是从here收集到的

    **编辑**更新****

    我已经把它做成了一个类,它也预先初始化了音频队列(在模拟器和设备中都很有用,因为它消除了播放第一个音频文件的启动滞后。

    您可以在此处找到 point1sec.mp3:http://www.xamuel.com/blank-mp3s/

    #import <AVFoundation/AVFoundation.h>
    #import "AudioToolbox/AudioServices.h"
    
    @interface sw_AVAudioPlayerSetup : NSObject
     <AVAudioPlayerDelegate> {
    
    }
    
    + (void)setupAudio ;
    + (void)setupSharedSession ;
    
    @end
    @implementation sw_AVAudioPlayerSetup
    
    + (void)setupSharedSession {
    
        static BOOL audioSessionSetup = NO;
        if (audioSessionSetup) {
            return;   
        }
        [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
        UInt32 doSetProperty = 1;
    
        AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
    
        [[AVAudioSession sharedInstance] setActive: YES error: nil];
    
        audioSessionSetup = YES;
    
    }
    
    + (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
        // delegate callback to release player
        [player release];
    }
    
    + (void)setupAudio {
    
        [self setupSharedSession];
    
        NSString *filepath = [[NSBundle mainBundle]                                                                                                  
                              pathForResource:@"point1sec"                                                                                                 
                              ofType:@"mp3"];
    
        if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]) {
    
            AVAudioPlayer* player = [[AVAudioPlayer alloc] 
                                     initWithContentsOfURL:
                                     [NSURL fileURLWithPath:filepath] 
                                     error:nil];
    
            player.delegate = (id <AVAudioPlayerDelegate>) self;
    
            [player play];
        }
    }
    

    【讨论】:

    • 如果您使用 ARC,则必须将音频播放器声明为“强”。否则它可能会提前发布,你不会得到任何声音。
    • AudioSessionSetProperty 在 iOS8 中已弃用
    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多