首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >averagePowerForChannel in AVPlayer

averagePowerForChannel in AVPlayer
EN

Stack Overflow用户
提问于 2016-08-26 12:11:24
回答 1查看 2.2K关注 0票数 2

我怎样才能在averagePowerForChannel中得到AVPlayer,以便在我的音乐应用程序上做一个音频可视化!我已经做了可视化部分,但我卡在它的引擎(实时音量通道)。

我知道通过使用AVAudioPlayer可以很容易地使用.meteringEnabled属性来完成,但是由于某种原因,AVPlayer在我的应用程序中是必须的!我实际上正在考虑将AVAudioPlayerAVPlayer一起使用以获得所需的结果,但这听起来有点麻烦,这如何影响性能和稳定性呢?提前感谢

EN

回答 1

Stack Overflow用户

发布于 2016-08-30 09:05:48

我对AVPlayer的可视化有一个问题,大约两年了。在我的例子中,它涉及到HLS直播,据我所知,在这种情况下,您将无法运行它。

编辑--这将不允许您访问averagePowerForChannel:方法,但是您将获得原始数据的访问权,例如,使用averagePowerForChannel:获取所需的信息。

不过,我让它和本地播放一起工作。你基本上是在等待玩家的项目有一个跟踪和运行。在这一点上,您将需要修补一个MTAudioProcessingTap到音频混合。

处理龙头将运行您指定的回调,您可以在其中计算所需的原始音频数据。

下面是一个快速示例(但是,很抱歉在ObjC中抛出它):

代码语言:javascript
复制
#import <AVFoundation/AVFoundation.h>
#import <MediaToolbox/MediaToolbox.h>

void init(MTAudioProcessingTapRef tap, void *clientInfo, void **tapStorageOut) {};
void finalize(MTAudioProcessingTapRef tap) {};
void prepare(MTAudioProcessingTapRef tap, CMItemCount maxFrames, const AudioStreamBasicDescription *processingFormat) {};
void unprepare(MTAudioProcessingTapRef tap) {};
void process(MTAudioProcessingTapRef tap, CMItemCount numberFrames, MTAudioProcessingTapFlags flags, AudioBufferList *bufferListInOut, CMItemCount *numberFramesOut, MTAudioProcessingTapFlags *flagsOut) {};

- (void)play {
    // player and item setup ...

    [[[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;

    OSStatus err = MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks, kMTAudioProcessingTapCreationFlag_PostEffects, &tap);

    if (err) {
        NSLog(@"error: %@", [NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil]);
        return;
    }

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

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

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

两年前在my question上正在进行一些讨论,所以也要确保检查它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39166034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档