【问题标题】:Adjusting the volume of a playing AVPlayer调整播放 AVPlayer 的音量
【发布时间】:2011-03-17 04:27:28
【问题描述】:

在当前播放的 AVPlayer 项目上获得音量变化的唯一方法是遵循这个过程;

  • 卸载当前播放的 AVPlayerItem 的资产
  • 获取该 AVPlayerItem 的当前播放时间
  • 将资产加载到新的 AVPlayerItem 中
  • 用新的替换当前的 AVPlayerItem
  • 等待当前项目在 AVPlayer 上更改
  • 准备您的 AudioMix 并寻找上一个播放时间

我是否在某处遗漏了一个基本原则,或者它是否意味着为了简单地管理音量级别而如此复杂?

我无法使用 AVAudioPlayer,因为我需要将 iTunes 曲目加载到播放器中。

【问题讨论】:

  • AVPlayer 是第三方框架/应用程序吗?
  • @Tyler: AVAudioPlayer 不是这里的问题......我们正在谈论 AVPlayer,因为 AVAudioPlayer 无法处理 ipod 库 URL

标签: iphone objective-c ios4


【解决方案1】:

请注意,原始问题(以及几个答案)中描述的基于AVMutableAudioMix 的方法适用于基于文件的资产,而不适用于流媒体。

这在 Apple 编写的文档中有详细说明,此处:

https://developer.apple.com/library/content/qa/qa1716/_index.html

当我尝试使用流式音频执行此操作时,我没有收到从 AVAsset 的 tracks(withMediaType:) 方法 (Swift) 返回的任何曲目。

【讨论】:

    【解决方案2】:
    - (IBAction)sliderAction:(id)sender {
    NSLog(@"slider :%f ", self.mixerSlider.value);
    
    NSArray *audioTracks = [self.videoHandler.videoAsset tracksWithMediaType:AVMediaTypeAudio];
    
    // Mute all the audio tracks
    NSMutableArray *allAudioParams = [NSMutableArray array];
    for (AVAssetTrack *track in audioTracks) {
        AVMutableAudioMixInputParameters *audioInputParams =[AVMutableAudioMixInputParameters audioMixInputParameters];
        [audioInputParams setVolume:self.mixerSlider.value atTime:kCMTimeZero];
        [audioInputParams setTrackID:[track trackID]];
        [allAudioParams addObject:audioInputParams];
    }
    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
    [audioMix setInputParameters:allAudioParams];
    
    [[self.mPlayer currentItem] setAudioMix:audioMix]; }
    

    此方法由滑块值改变调用。您可以在视频播放时调用它。

    【讨论】:

      【解决方案3】:

      您可以使用此处描述的方法在播放时更改音量:

      http://developer.apple.com/library/ios/#qa/qa1716/_index.html

      虽然文章的文字似乎暗示它只能用于静音,但您实际上可以将音量设置为您喜欢的任何值,并且可以在播放音频后进行设置。例如,假设您的 AVAsset 实例称为“asset”,您的 AVPlayerItem 实例称为“playerItem”,而您要设置的音量称为“volume”,则以下代码应该可以满足您的要求:

      NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio];
      
      NSMutableArray *allAudioParams = [NSMutableArray array];
      for (AVAssetTrack *track in audioTracks) {
        AVMutableAudioMixInputParameters *audioInputParams = 
          [AVMutableAudioMixInputParameters audioMixInputParameters];
        [audioInputParams setVolume:volume atTime:kCMTimeZero];
        [audioInputParams setTrackID:[track trackID]];
        [allAudioParams addObject:audioInputParams];
      }
      
      AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
      [audioMix setInputParameters:allAudioParams];
      
      [playerItem setAudioMix:audioMix];
      

      【讨论】:

      • 感谢您的链接。我在该页面的底部发现了一条非常重要的信息。 “注意:AVAudioMix 仅支持基于文件的资产。”我不知道为什么我的渐变被破坏了,现在我知道了,因为我最初的测试是使用本地文件,现在它们正在流式传输。似乎没有办法使用 AVPlayer 调整流式曲目的音量...?
      • 有趣。对我来说,它似乎正在使用流媒体,所以可能还有其他一些因素必须如此。我想在有时间的时候制作一个简单的测试应用程序。
      • 你能帮我这个代码吗AVPlayer *avPlayer = [[AVPlayer alloc] initWithURL:songURL];[avPlayer play]; 当我有这么简单的行时,我是否需要使用这么长的代码..
      • 这东西有效,但在 iPod Touch (iOS 4.0) 等旧设备中,如果我在像这样手动寻找播放器(快进/快退)后尝试这样做,[player seekToTime:newTime];,那么这种技术停止工作。音量不变。知道为什么会这样吗?
      • 阅读文档时,我知道 Apple 不希望我们通过 MPVolumeView 控制音量。那么你认为这个代码会被批准吗?
      【解决方案4】:

      您是否尝试过只准备一个 AVMutableAudioMix 并将其设置在 AVPlayerItem 上,而它仍在播放?您应该能够向 AVPlayer 询问它的 currentItem,它可以提供 AVMutableAudioMix 的 AVMutableAudioMixInputParameters 应该引用的轨道。您为混合提供的时间与应用混合的时间有关。

      【讨论】:

      • 只是设置 [[player currentItem] setAudioMix:audioMix]; (来自 UISlider valueChanged 操作)是好的。
      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2019-08-20
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多