Extrait/Enregistrer de l'Audio à partir de HLS flux (vidéo) lors de la lecture iOS
Je joue les flux HLS à l'aide de AVPlayer. Et j'ai aussi besoin d'enregistrer ces flux utilisateur appuie sur le bouton d'enregistrement.
L'approche que j'utilise est d'enregistrer audio et vidéo séparément, puis à la fin de fusionner ces fichiers pour faire de la vidéo finale. Et C'est réussi avec les distance les fichiers mp4.
Mais maintenant, pour la HLS (.m3u8) les fichiers que je suis capable d'enregistrer la vidéo à l'aide de AVAssetWriter, mais ayant des problèmes avec l'enregistrement audio.
Je suis en utilisant MTAudioProccessingTap pour traiter les raw des données audio et de les écrire dans un fichier. J'ai suivi cette article. Je suis capable d'enregistrer à distance mp4 audio, mais sa ne fonctionne pas avec les flux HLS.
Au départ, je n'étais pas capable d'extraire les pistes audio à partir du flux à l'aide de AVAssetTrack *audioTrack = [actif tracksWithMediaType:AVMediaTypeAudio][0];
Mais j'ai réussi à extraire le audioTracks à l'aide de KVO pour initialiser le MTAudioProcessingTap.
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
AVPlayer *player = (AVPlayer*) object;
if (player.status == AVPlayerStatusReadyToPlay)
{
NSLog(@"Ready to play");
self.previousAudioTrackID = 0;
__weak typeof (self) weakself = self;
timeObserverForTrack = [player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1, 100) queue:nil usingBlock:^(CMTime time)
{
@try {
for(AVPlayerItemTrack* track in [weakself.avPlayer.currentItem tracks]) {
if([track.assetTrack.mediaType isEqualToString:AVMediaTypeAudio])
weakself.currentAudioPlayerItemTrack = track;
}
AVAssetTrack* audioAssetTrack = weakself.currentAudioPlayerItemTrack.assetTrack;
weakself.currentAudioTrackID = audioAssetTrack.trackID;
if(weakself.previousAudioTrackID != weakself.currentAudioTrackID) {
NSLog(@":::::::::::::::::::::::::: Audio track changed : %d",weakself.currentAudioTrackID);
weakself.previousAudioTrackID = weakself.currentAudioTrackID;
weakself.audioTrack = audioAssetTrack;
///Use this audio track to initialize MTAudioProcessingTap
}
}
@catch (NSException *exception) {
NSLog(@"Exception Trap ::::: Audio tracks not found!");
}
}];
}
}
Je suis également garder la trace de trackID pour vérifier si la piste est changé.
C'est comment j'ai initialiser le MTAudioProcessingTap.
-(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);
NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain
code:err
userInfo:nil];
NSLog(@"Error: %@", [error description]);;
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];
_audioPlayer.currentItem.audioMix = audioMix;
}
Mais Maintenant, avec cette piste audio MTAudioProcessingTap rappels de "Préparer" et "Processus" ne sont jamais appelés.
Est le problème avec le audioTrack je suis passer à travers KVO?
Maintenant je serais vraiment reconnaissant si quelqu'un peut m'aider avec cela. Ou peut dire suis-je à l'aide de l'écriture approche pour enregistrer les Flux HLS?
J'ai posté la bonne réponse. veuillez vérifier.
Merci beaucoup Sajad.
u peut partager un code pour l'enregistrement en direct et en streaming svp
OriginalL'auteur Sajad Khan | 2015-07-29
Vous devez vous connecter pour publier un commentaire.
J'ai Trouvé la solution pour le présent et l'utiliser dans mon application. Je voulais poster plus tôt mais n'ai pas eu le temps.
Donc, pour jouer avec HLS, vous devriez avoir une certaine connaissance de ce qu'ils sont exactement. Pour cela, veuillez voir ici sur le Site d'Apple.
Apple HLS
Voici les étapes que je suis.
1. De la première à obtenir le m3u8 et de l'analyser.
Vous pouvez l'analyser en utilisant ce utile kit M3U8Kit.
À l'aide de ce kit, vous pouvez obtenir le M3U8MediaPlaylist ou M3U8MasterPlaylist(si c'est un maître de la playlist)
si vous obtenez le maître de la liste de lecture, vous pouvez également analyser pour obtenir M3U8MediaPlaylist
Vous pouvez voir que vous obtiendrez les liens vers les .ts fichiers à partir de la m3u8 l'analyser.
Vous pouvez le faire en utilisant cette merveilleuse bibliothèque C
TS2MP4
et vous pouvez ensuite supprimer le .ts fichiers ou de les garder si vous en avez besoin.
Oui Carlos F vous avez raison à propos de ce que vous avez à gérer, car cela permettra aussi de créer un gâchis lorsque le joueur a touché d'abord le serveur et puis plus tard vous essayez de l'analyser. Mais j'ai réussi à enregistrer les flux en direct également à l'aide de cette approche.
Pouvez-vous élaborer répondre dans plus de détails. La réponse ci-dessus n'est pas clair. Ou il sera plus reconnaissants si vous faites un projet de démonstration sur elle.
OriginalL'auteur Sajad Khan
Ce n'est pas une bonne approche de ce que vous pouvez faire est d'Analyser M3U8 lien .Puis essayez de télécharger des fichiers de segment (.ts) . Si vous pouvez obtenir ces fichiers, vous pouvez les fusionner pour générer un fichier mp4.
OriginalL'auteur Aamir