약 2 년간 AVPlayer
시각화 문제가 있습니다. 제 경우에는 HLS 라이브 스트리밍이 포함됩니다.이 경우, 제 지식에 따라 실행되지 않을 것입니다.
EDIT 이렇게하면 averagePowerForChannel:
방법에 액세스 할 수 없지만 원시 데이터에 액세스 할 수 있으며 예를 들어 FFT로 원하는 정보를 얻을 수 있습니다.
로컬 재생으로 작업하게되었습니다. 당신은 기본적으로 플레이어 플레이어 아이템이 궤도를 올리고 작동 할 때까지 기다립니다. 이 때 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];
}
이 논의는 2 년 전부터 my question에 걸쳐 진행되므로으로 확인해야합니다 있습니다 잘.
AVPlayer에 averagePowerForChannel을 가져 오는 방법을 찾았습니까? –
안녕하세요, 솔루션을 찾았지만 비 온라인 파일을 재생할 때만 작동합니다. 필요하면 알려주세요 –
불행히도 원격 파일을 사용하고 있습니다. 그래도 나는 당신의 솔루션에 관심이 있습니다. –