首页 文章

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

提问于
浏览
5

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

我可以使用和MPMediaQuery从本地iPod lib中选择一个曲目,但是当我尝试使用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];
}

所以此时数组是我的lib中的一个轨道数组 .

现在 grab 一个并使用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播放文件时,调整音量是有效的(流媒体);只是不是从当 Map 书馆玩 .

我意识到我这里没有做任何内存管理;只是想让它先工作 . 此外,本地玩家是一个属性,所以没有明确的保留 .

任何帮助将不胜感激!

谢谢 .

4 回答

  • 0

    AVMutableAudioMix 仅适用于基于文件的媒体,而不适用于实时HTTP流媒体 .

  • 0

    这项工作对我来说(淡入):

    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];
    }
    
  • 1

    您是否尝试用CMTimeMakeWithSeconds(0,1)替换kCMTimeZero,或者只是0?

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

  • 1

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

相关问题