我怎样才能在averagePowerForChannel中得到AVPlayer,以便在我的音乐应用程序上做一个音频可视化!我已经做了可视化部分,但我卡在它的引擎(实时音量通道)。
我知道通过使用AVAudioPlayer可以很容易地使用.meteringEnabled属性来完成,但是由于某种原因,AVPlayer在我的应用程序中是必须的!我实际上正在考虑将AVAudioPlayer与AVPlayer一起使用以获得所需的结果,但这听起来有点麻烦,这如何影响性能和稳定性呢?提前感谢
发布于 2016-08-30 09:05:48
我对AVPlayer的可视化有一个问题,大约两年了。在我的例子中,它涉及到HLS直播,据我所知,在这种情况下,您将无法运行它。
编辑--这将不允许您访问averagePowerForChannel:方法,但是您将获得原始数据的访问权,例如,使用averagePowerForChannel:获取所需的信息。
不过,我让它和本地播放一起工作。你基本上是在等待玩家的项目有一个跟踪和运行。在这一点上,您将需要修补一个MTAudioProcessingTap到音频混合。
处理龙头将运行您指定的回调,您可以在其中计算所需的原始音频数据。
下面是一个快速示例(但是,很抱歉在ObjC中抛出它):
#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上正在进行一些讨论,所以也要确保检查它。
https://stackoverflow.com/questions/39166034
复制相似问题