programming learn framework development desarrollador cuenta app ios audio avplayer pcm hls

framework - learn ios



Obteniendo datos PCM de HLS desde AVPlayer (1)

Esta pregunta parece haberse formulado pocas veces en los últimos años, pero ninguna tiene respuesta para eso. Estoy tratando de procesar datos de PCM de HLS y tengo que usar AVPlayer.

esta publicación toca los archivos locales https://chritto.wordpress.com/2013/01/07/processing-avplayers-audio-with-mtaudioprocessingtap/

y este tap funciona con archivos remotos pero no con archivos .m3u8 hls. http://venodesigns.net/2014/01/08/recording-live-audio-streams-on-ios/

Puedo reproducir las dos primeras pistas en la lista de reproducción, pero no se inician las devoluciones de llamada necesarias para obtener el pcm, cuando el archivo es local o remoto (no transmisión) aún puedo obtener el pcm, pero es que el hls no funciona y yo necesita HLS trabajando

aquí está mi código

//avplayer tap try - (void)viewDidLoad { [super viewDidLoad]; NSURL*testUrl= [NSURL URLWithString:@"http://playlists.ihrhls.com/c5/1469/playlist.m3u8"]; AVPlayerItem *item = [AVPlayerItem playerItemWithURL:testUrl]; self.player = [AVPlayer playerWithPlayerItem:item]; // Watch the status property - when this is good to go, we can access the // underlying AVAssetTrack we need. [item addObserver:self forKeyPath:@"status" options:0 context:nil]; } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if(![keyPath isEqualToString:@"status"]) return; AVPlayerItem *item = (AVPlayerItem *)object; if(item.status != AVPlayerItemStatusReadyToPlay) return; NSArray *tracks = [self.player.currentItem tracks]; for(AVPlayerItemTrack *track in tracks) { if([track.assetTrack.mediaType isEqualToString:AVMediaTypeAudio]) { NSLog(@"GOT DAT FUCKER"); [self beginRecordingAudioFromTrack:track.assetTrack]; [self.player play]; } } } - (void)beginRecordingAudioFromTrack:(AVAssetTrack *)audioTrack { // Configure an MTAudioProcessingTap to handle things. 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 = finalize; OSStatus err = MTAudioProcessingTapCreate( kCFAllocatorDefault, &callbacks, kMTAudioProcessingTapCreationFlag_PostEffects, &tap ); if(err) { NSLog(@"Unable to create the Audio Processing Tap %d", (int)err); return; } // Create an AudioMix and assign it to our currently playing "item", which // is just the stream itself. AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack]; inputParams.audioTapProcessor = tap; audioMix.inputParameters = @[inputParams]; self.player.currentItem.audioMix = audioMix; } void process(MTAudioProcessingTapRef tap, CMItemCount numberFrames, MTAudioProcessingTapFlags flags, AudioBufferList *bufferListInOut, CMItemCount *numberFramesOut, MTAudioProcessingTapFlags *flagsOut) { OSStatus err = MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, flagsOut, NULL, numberFramesOut); if (err) NSLog(@"Error from GetSourceAudio: %d", (int)err); NSLog(@"Process"); } void init(MTAudioProcessingTapRef tap, void *clientInfo, void **tapStorageOut) { NSLog(@"Initialising the Audio Tap Processor"); *tapStorageOut = clientInfo; } void finalize(MTAudioProcessingTapRef tap) { NSLog(@"Finalizing the Audio Tap Processor"); } void prepare(MTAudioProcessingTapRef tap, CMItemCount maxFrames, const AudioStreamBasicDescription *processingFormat) { NSLog(@"Preparing the Audio Tap Processor"); } void unprepare(MTAudioProcessingTapRef tap) { NSLog(@"Unpreparing the Audio Tap Processor"); }

void init se llama void prepare y el process debe ser llamado.

¿Cómo puedo hacer esto?


Yo recomendé usar Novocaine

El audio realmente rápido en iOS y Mac OS X que usa unidades de audio es difícil y te dejará con cicatrices y sangre. Lo que solía tomar días ahora se puede hacer con unas pocas líneas de código.