setVolume 无法在 AVMutableAudioMixInputParameters 上使用手机本地 iPod 库播放

Posted

技术标签:

【中文标题】setVolume 无法在 AVMutableAudioMixInputParameters 上使用手机本地 iPod 库播放【英文标题】:setVolume not working on AVMutableAudioMixInputParameters with playing from phones local iPod library 【发布时间】:2011-01-25 01:12:25 【问题描述】:

我目前正在尝试使用 AVPlayer 而不是使用应用程序控制器的 MPMusicPlayerController 播放手机本地 iPod 库中的音乐。

我可以使用 MPMediaQuery 从本地 iPod 库中选择一个曲目,但是当我尝试使用 AVMutableAudioMixInputParameters 在较低级别启动音频时,它似乎根本没有降低音量。

我使用 AVPlayer 而不是 MPMusicPlayerController 的原因是我同时在后台播放一些其他音频,而 MPMusicPlayerController 无法播放,因为使用 AVPlayer 的现有音频文件占用了硬件。我现在的代码是:

// just blindly select all music for now.
MPMediaQuery *everything = [[MPMediaQuery alloc] init];

NSArray *itemsFromGenericQuery = [everything items];
MPMediaItem *song;
NSMutableArray *array = [[NSMutableArray alloc] init];

for (song in itemsFromGenericQuery) 

    [array addObject:song];

所以此时数组是我的库中的一组曲目。

现在抓取一个并使用 AVPlayer 播放它:

// grab the first song off the array
MPMediaItem *song = [array objectAtIndex:0];
NSURL *assetURL = [song valueForProperty:MPMediaItemPropertyAssetURL];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:assetURL options:nil];

NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio];
AVAssetTrack *track = [audioTracks objectAtIndex:0];

NSMutableArray *allAudioParams = [NSMutableArray array];
AVMutableAudioMixInputParameters *audioInputParams = 
        [AVMutableAudioMixInputParameters audioMixInputParameters];

// this is the key line - turn the volume down.
[audioInputParams setVolume:0.3 atTime:kCMTimeZero];
[audioInputParams setTrackID:[track trackID]];
[allAudioParams addObject:audioInputParams];

AVMutableAudioMix *audioZeroMix = [AVMutableAudioMix audioMix];
[audioZeroMix setInputParameters:allAudioParams];

// Create a player item
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];

[playerItem setAudioMix:audioZeroMix];
[playerItem seekToTime:CMTimeMake(30, 1)];

[self setLocalPlayer:[AVPlayer playerWithPlayerItem:playerItem]];
[localPlayer play];

我可以确认在使用 AVPlayer 播放来自 URL(流)的文件时调整音量有效;只是在本地图书馆播放时不会。

我意识到我没有在这里进行任何内存管理;只是想让它首先工作。此外,本地播放器是一个属性,因此没有显式保留。

任何帮助将不胜感激!

谢谢。

【问题讨论】:

我不是 iPhone 开发者,但是那个函数的名字是不是……有点太长了? 嘿,有点——但它是一个标准库库/函数。 你找到解决方案了吗? 【参考方案1】:

AVMutableAudioMix 仅适用于基于文件的媒体,不适用于实时 http 流。

【讨论】:

【参考方案2】:

为我工作(淡入):

NSString *songName = [NSString stringWithFormat:@"http://xx.xx.xx.xx/%d%@", bitrate, url];
playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:songName]];

NSArray *audioTracks = [[playerItem asset] tracks];

AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTracks[0]];
[audioInputParams setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0.0, 1.0), CMTimeMakeWithSeconds(3.0, 1.0))];

AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
[audioMix setInputParameters:@[audioInputParams]];

[playerItem setAudioMix:audioMix];

AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem];

当用户跳到下一首曲目或曲目几乎完成时,我调用函数:

- (void)fadeOut 
    seconds = CMTimeGetSeconds(playerItem.currentTime);

    NSArray *audioTracks = [[playerItem asset] tracks];

    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTracks[0]];
    [audioInputParams setVolumeRampFromStartVolume:1.0 toEndVolume:0.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(seconds, 1.0), CMTimeMakeWithSeconds(3.0, 1.0))];

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
    [audioMix setInputParameters:@[audioInputParams]];

    [playerItem setAudioMix:audioMix];

【讨论】:

【参考方案3】:

您是否尝试将 kCMTimeZero 替换为 CMTimeMakeWithSeconds(0,1) 或简单的 0?

如果仍然失败,请尝试淡入/淡出效果并将开始时间和结束时间设置为 0。

【讨论】:

【参考方案4】:

尝试使用负时间值,例如CMTimeMake(-1, 1),而不是kCMTimeZero

【讨论】:

以上是关于setVolume 无法在 AVMutableAudioMixInputParameters 上使用手机本地 iPod 库播放的主要内容,如果未能解决你的问题,请参考以下文章

AVMutableAudioMixInputParameters:setVolume() 不适用于 iOS 9 的音频文件

Android:MediaPlayer setVolume 函数

如何在android中静音MediaPlayer

如何以编程方式增加iPhone音量

如何在使用 UISlider 更改音量时隐藏 Iphone 音量框?

音频在后台播放但没有声音 Cordova 3+ IOS