0

我想用UISlider.

currentItem在里面用过AVQueuePlayerps0是一个AVQueuePlayer

当我使用我的时,我没有错误和相同的声级UISlider

- (IBAction)volumeSliderMoved:(UISlider *)sender
{
    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters];

    AVPlayerItem *av = [ps0 currentItem];
    CMTime currentTime = [av currentTime];
    float volume = [sender value];

    [audioInputParams setVolume:volume atTime:currentTime];
    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
    audioMix.inputParameters = [NSArray arrayWithObject:audioInputParams];
    av.audioMix = audioMix;

    [ps0 replaceCurrentItemWithPlayerItem: av];
}

已编辑: 我尝试了 Apple 的另一种解决方案来更改音量设置。

正如您在此解决方案中看到的,它创建了一个新的playerItem和一个新的播放器。

但我playerItem是当前的副本,因为我只想更改声音(而不是项目)。它会自动与旧播放器相关联。

当我尝试使用他们的解决方案时。我有一条错误消息说:

一个 AVPlayerItem 不能与多个 AVPlayer 实例关联

有什么建议吗?

再次编辑

使用 AVQueuePlayer 更改播放

我有一个包含每个 mp3 名称“textMissingTab”的数组</p>

我有一个带有 AVPlayerItem “soundItems”的数组</p>

创作:

textMissingTab = [[NSArray alloc] initWithObjects:@"cat",@"mouse",@"dog",@"shark",@"dolphin", @"eagle", @"fish", @"wolf", @"rabbit", @"person", @"bird", nil];

for (NSString *text in textMissingTab)
{
    NSURL *soundFileURL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:text ofType:@"mp3"]];
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:soundFileURL];
    [soundItems addObject:item];
}

在里面 :

NSURL *soundFileURL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:@"dog" ofType:@"mp3"]];
ps0 = [[AVQueuePlayer alloc] initWithURL:soundFileURL];

更改 playItem :文本为 NSString

int index = [textMissingTab indexOfObject:text];
[ps0 setActionAtItemEnd:AVPlayerActionAtItemEndNone];
CMTime newTime = CMTimeMake(0, 1);
[ps0 seekToTime:newTime];
[ps0 setRate:1.0f];
[ps0 replaceCurrentItemWithPlayerItem:[soundItems objectAtIndex:(index)]];
[ps0 play];
4

3 回答 3

0

我在使用 AVQueuePlayer 和更改播放参数时遇到了几个问题。如果您的目标是使用滑块进行音量调整,我会在情节提要中将 UISlider 替换为空白 UIView,然后在该视图中实例化 MPVolumeView。这对我来说很可靠。请注意,MPVolumeView 不会显示在模拟器上。

于 2013-04-23T17:14:10.603 回答
0

我认为你是对的。MPVolumeView 是管理声级的最佳方式。

本教程对此进行了解释:http ://www.littlereddoor.co.uk/ios/controlling-system-output-volume-by-adding-an-mpvolumeview-object-to-an-ios-application/

“一切都完全按照我们的预期工作,直到用户遇到由设备上设置的当前铃声音量创建的绊脚石。AVAudioPlayer 属性的最大值为 1.0,其中 1.0 等于当前铃声音量设置设备的。简单地说,如果设备铃声音量设置为 50% 音量,那么 100% 的 AVAudioPlayer 音量仍然只相当于已经设置的 50% 铃声。使用这种方法的局限性不言而喻。

我再次编辑了我的帖子,以展示我如何使用 AVQueuePlayer 管理一些歌曲。这部分代码正在工作。

于 2013-04-24T07:26:01.397 回答
0
AVAsset *asset;
NSArray *playerTracks;
NSMutableArray *playerParams;
AVMutableAudioMix *muteAudioMix;
for (int k=0; k<[[audio items] count]; k++)
    {
        //disable audio (this is the version when you have more than one video in the playlist: i write this version so it should be more useful)
        asset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[soundfile objectAtIndex:k+([soundfile count]-[[audio items] count])] ofType:@"mp3"]] options:nil];

        playerTracks = [asset tracksWithMediaType:AVMediaTypeAudio];
        playerParams = [NSMutableArray array];
        for (AVAssetTrack *track in playerTracks) {
            AVMutableAudioMixInputParameters *audioInputParams =    [AVMutableAudioMixInputParameters audioMixInputParameters];
            [audioInputParams setVolume:1.0 atTime:kCMTimeZero];
            [audioInputParams setTrackID:[track trackID]];
            [playerParams addObject:audioInputParams];
        }
        muteAudioMix = [AVMutableAudioMix audioMix];
        [muteAudioMix setInputParameters:playerParams];

        [[[audio items] objectAtIndex:k] setAudioMix:muteAudioMix];
    }
于 2013-11-28T08:26:11.753 回答