【问题标题】:Mute an HTTP Live Stream in an AVPlayer在 AVPlayer 中静音 HTTP 直播流
【发布时间】:2012-07-16 04:45:39
【问题描述】:

我已经尝试解决这个问题 48 小时了,但没有提出任何建议。我有 2 个 AVPlayer 对象播放不同的 http 直播流。显然,我不希望他们同时播放音频,所以我需要一种方法来静音其中一个视频。

Apple suggests this 将 AVPlayer 中播放的音轨静音...

NSMutableArray *allAudioParams = [NSMutableArray array];
for (AVPlayerItemTrack *track in [_playerItem tracks]) {
    if ([track.assetTrack.mediaType isEqualToString:AVMediaTypeAudio]) {
        AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters];
        [audioInputParams setVolume:0.0 atTime:CMTimeMakeWithSeconds(0,1)];
        [audioInputParams setTrackID:[track.assetTrack trackID]];
        [allAudioParams addObject:audioInputParams];
        // Added to what Apple Suggested
        [track setEnabled:NO];
    }
}

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

当这不起作用时(经过多次迭代),我找到了AVPlayerItemTrack 的启用属性并尝试将其设置为 NO。也没什么。这甚至没有注册为做任何事情,因为当我尝试 NSLog(@"%x",track.enabled) 时,它仍然显示为 1。

我很茫然,我想不出另一篇我可以阅读并重新阅读以获得好的答案的文档。如果有人可以提供帮助,那就太好了。

*更新:我拿到了 Apple,根据 AVFoundation 团队的说法,不可能静音或禁用 HLS 视频的轨道。我个人觉得这是一个错误,所以我提交了一个bug report(你应该这样做告诉苹果这是一个问题)。你也可以 尝试通过他们的反馈页面提交feature enhancement request。

【问题讨论】:

    标签: objective-c ios streaming avplayer http-live-streaming


    【解决方案1】:

    新的 iOS 7 答案: AVPlayer 现在有 2 个新属性“音量”和“静音”。使用那些!


    这是 iOS 7 之前生活的原始答案:

    我一直在处理同样的事情。我们创建了静音流和带音频的流。要静音或取消静音,请致电[player replaceCurrentItemWithPlayerItem:muteStream]。

    我还提交了错误报告。看起来AVPlayer 在 MacOS 10.7 上具有此功能,但尚未在 iOS 上实现。

    AVAudioMix is documented not to work on URL assets here

    当然我还是试过了,和你一样,我发现它真的不起作用。

    【讨论】:

    • 感谢您的回答,这为我解决我试图解决的问题之一开辟了道路。我正在尝试对 OpenAL 做同样的事情,但没有找到直接的方法。我知道你可以通过 alSourcef(sourceID, AL_GAIN, volume); 降低音量。但不知道如何静音,有没有快速的解决方法?
    【解决方案2】:

    最好的解决方案是在流 url 提要中嵌入两个音轨!一个是普通音频,另一个是静音音频。

    这样做比 ComPuff 建议的方式更有意义,因为他实际上创建了两个单独的 URL 流 - 这不是必需的。

    这是您可以用来切换音轨的代码:

        float volume = 0.0f;
    
    AVPlayerItem *currentItem = self.player.currentItem;
    NSArray *audioTracks = self.player.currentItem.tracks;
    
    DLog(@"%@",currentItem.tracks);
    
    NSMutableArray *allAudioParams = [NSMutableArray array];
    
    for (AVPlayerItemTrack *track in audioTracks)
    {
        if ([track.assetTrack.mediaType isEqual:AVMediaTypeAudio])
        {
            AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters];
            [audioInputParams setVolume:volume atTime:kCMTimeZero];
            [audioInputParams setTrackID:[track.assetTrack trackID]];
            [allAudioParams addObject:audioInputParams];
        }
    }
    
    if ([allAudioParams count] > 0) {
        AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
        [audioMix setInputParameters:allAudioParams];
        [currentItem setAudioMix:audioMix];
    }
    

    唯一的问题是我的流 url 只显示两个轨道(一个用于视频,一个用于音频),而它实际上应该是三个轨道(2 个音频轨道)。我无法确定这是流 url 还是我的代码的问题!谁能发现代码中的任何错误?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2011-06-05
      相关资源
      最近更新 更多