IT Share you

AVPlayer HLS 라이브 스트림 레벨 미터 (FFT 데이터 표시)

shareyou 2020. 12. 5. 10:58
반응형

AVPlayer HLS 라이브 스트림 레벨 미터 (FFT 데이터 표시)


내가 사용하고 AVPlayer라이브 스트리밍을 사용하여 HTTP 라디오 앱. 이제 해당 오디오 스트림에 대한 레벨 미터를 구현하고 싶습니다. 가장 좋은 방법은 서로 다른 주파수를 보여주는 레벨 미터이지만 간단한 왼쪽 / 오른쪽 솔루션이 좋은 출발점이 될 것입니다.

나는 AVAudioPlayer. 그러나 필요한 정보를 얻을 수있는 해결책을 찾을 수 없습니다 AVPlayer.

누군가 내 문제에 대한 해결책을 생각할 수 있습니까?

편집 나는 이와 같은 것을 만들고 싶다 (하지만 더 멋지다)

좋은 레벨 미터

편집 II

한 가지 제안은 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


안타깝게도 HLS 스트림을 사용 AVFoundation하면 오디오 트랙을 제어 할 수 없습니다. 나는 불가능한 것으로 판명 된 HLS 스트림을 음소거하려고 시도하는 것과 동일한 문제가 발생했습니다.

The only way you could read audio data would be to tap into the AVAudioSession.

EDIT

You can access the AVAudioSession like this:

[AVAudioSession sharedInstance]

Here's the documentation for AVAudioSession


Measuring audio using AVPlayer looks to be an issue that is still ongoing. That being said, I believe that the solution can be reached by combining AVPlayer with AVAudioRecorder.

While the two classes have seemingly contradictory purposes, there is a work around that allows AVAudioRecorder to access the AVPlayer's audio output.

Player / Recorder

As described in this Stack Overflow Answer, recording the audio of a AVPlayer is possible if you access the audio route change using kAudioSessionProperty_AudioRouteChange.

Notice that the audio recording must be started after accessing the audio route change. Use the linked stack answer as a reference - it includes more details and necessary code.

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

Once you have access to the AVPlayer's audio route and are recording, the measuring is relatively straightforward.

Audio Levels

In my answer to a stack question regarding measuring microphone input I describe the steps necessary to access the audio level measurements. Using AVAudioRecorder to monitor volume changes is more complex than one would think, so I included a GitHub project that acts as a template for monitoring audio changes while recording.

~~~~~~~~~~~~~~~~~~~~~~~~~~ 참고 ~~~~~~~~~~~~~~~~~~~~ ~~~~

HLS 라이브 스트림 중이 조합은 제가 테스트 한 것이 아닙니다. 이 대답은 엄밀히 말하면 이론적이므로 두 수업을 완전히 이해하려면 두 수업을 완전히 이해해야 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/19403584/avplayer-hls-live-stream-level-meter-display-fft-data

반응형