AVPlayer HLS实时流量计(显示FFT数据)

Jul*_*ert 60 objective-c avfoundation media-player ios avplayer

我正在使用AVPlayerHTTP直播的无线电应用程序.现在我想为该音频流实现一个电平表.最好的水平仪显示不同的频率,但简单的左/右解决方案将是一个很好的起点.

我发现了几个使用的例子AVAudioPlayer.但我无法找到解决所需信息的解决方案AVPlayer.

有人能想到我的问题的解决方案吗?

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

很好的水平仪

编辑二

一个建议是用于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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sim*_*ain 2

遗憾的是,使用 HLS 流AVFoundation无法让您对音轨进行任何控制。我在尝试将 HLS 流静音时遇到了同样的问题,结果证明这是不可能的。

读取音频数据的唯一方法是利用AVAudioSession.

编辑

您可以像这样访问 AVAudioSession:

[AVAudioSession sharedInstance]
Run Code Online (Sandbox Code Playgroud)

这是AVAudioSession的文档

  • @MDB983 只是为了回顾两年后的情况......您愿意向我们提供有关_如何_做到这一点的任何细节吗? (3认同)