ios-AVPlayer HLS实时流电平表(显示FFT数据)

我正在将MTAudioProcessingTap用于使用HTTP实时流传输的广播应用程序。 现在,我想为该音频流实现一个电平表。 最好是显示不同频率的电平表,但是简单的左/右解决方案将是一个很好的起点。

我找到了使用MTAudioProcessingTap的几个示例。但是我找不到用于从[[[_player currentItem] asset] tracks]获取所需信息的解决方案。

有人可以为我的问题找到解决方案吗?

编辑我想创建这样的东西(但更好)

nice levelmeter

编辑二

一种建议是使用MTAudioProcessingTap获取原始音频数据。 我可以使用[[[_player currentItem] asset] tracks]数组找到示例,在我的情况下,该数组为空数组。 另一个建议是使用[[_player currentItem] audioMix],对我来说是null

编辑III

经过多年,似乎仍然没有解决方案。 我确实取得了进步,所以我要分享。

在设置过程中,我将一个键值观察器添加到playerItem:

[[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL];

//////////////////////////////////////////////////////

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context
    if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) {
        for (AVPlayerItemTrack *itemTrack in [object tracks]) {
            AVAssetTrack *track = [itemTrack assetTrack];

            if ([[track mediaType] isEqualToString:AVMediaTypeAudio]) {
                [self addAudioProcessingTap:track];
                break;
            }
        }
}

- (void)addAudioProcessingTap:(AVAssetTrack *)track {
    MTAudioProcessingTapRef tap;
    MTAudioProcessingTapCallbacks callbacks;
    callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
    callbacks.clientInfo = (__bridge void *)(self);
    callbacks.init = init;
    callbacks.prepare = prepare;
    callbacks.process = process;
    callbacks.unprepare = unprepare;
    callbacks.finalize = finalise;

    // more tap setup...

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

    AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
    [inputParams setAudioTapProcessor:tap];
    [audioMix setInputParameters:@[inputParams]];

    [[[self player] currentItem] setAudioMix:audioMix];
}

到现在为止还挺好。 所有这些都可以,我可以找到正确的轨道并设置inputParams和audioMix等。但是不幸的是,唯一被调用的回调是init回调。 其他任何人都不会在任何时候开火。

我尝试了不同的(多种)流源,其中一种是官方的Apple HLS流:[http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8]

2个解决方案
1 votes

可悲的是,将HLS流与AVAudioSession结合使用并不能使您对音轨有任何控制。 我遇到了试图使HLS流静音的同样问题,事实证明这是不可能的。

读取音频数据的唯一方法是点击AVAudioSession

编辑

您可以这样访问AVAudioSession:

[AVAudioSession sharedInstance]

这是AVAudioSession的文档

Simon Germain answered 2019-10-08T12:57:25Z
1 votes

使用AVAudioRecorder测量音频似乎仍然是一个问题。 话虽如此,我相信可以通过将AVPlayerAVAudioRecorder结合来实现解决方案。

虽然这两个类的目的看似相互矛盾,但有一种解决方法可以使AVAudioRecorder访问AVPlayer的音频输出。

播放器/记录器

如此堆栈溢出答案中所述,如果您使用AVAudioRecorder访问音频路由更改,则可以记录AVPlayer的音频。

请注意,在访问音频路由更改后必须开始录音。 使用链接的堆栈答案作为参考-它包含更多详细信息和必要的代码。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~

一旦访问了AVAudioRecorder的音频路径并进行记录,测量就相对简单了。

音频电平

在回答有关测量麦克风输入的堆栈问题时,我描述了访问音频电平测量所必需的步骤。 使用AVAudioRecorder监视音量变化比人们想象的要复杂,因此我包含了一个GitHub项目,该项目充当监视录音时音频变化的模板。

~~~~~~~~~~~~~~~~~~~~~~~~~~请注意~~~~~~~~~~~~~~~~~~~~~ ~~~~

我没有测试过HLS直播期间的这种组合。 严格来说,这个答案是理论上的,因此可能需要对这两个课程有一个完整的理解。

ChrisHaze answered 2019-10-08T12:59:18Z
translate from https://stackoverflow.com:/questions/19403584/avplayer-hls-live-stream-level-meter-display-fft-data