Je suis implémentant Avadiaplayer pour jouer audio et cela fonctionne parfaitement bien lors de la lecture de fichiers stockés localement sur le PC.
Mais lorsque je donne l'URL de certains fichiers audio sur Internet, il échoue malheureusement.
Voici ce que le code ressemble à: p> pourrait-il signaler le problème et ce qui pourrait être fait?
Merci! P> p>
4 Réponses :
J'ai essayé une autre méthode initwithdata sur Avaudioplayer au lieu d'InitwithContentsofurl. Essayez d'abord d'obtenir un fichier MP3 dans Nsdata, puis de lire ces données. P>
Regardez mon code ici . P>
C'est ce que dit les Documents Apple: P>
Le Avaudioplayer CODE> La classe ne fournit pas de support à la diffusion audio en streaming basée sur les URL HTTP. L'URL utilisée avec
initwithcontentsofurl: code> doit être une URL de fichier (
fichier: // code>). C'est-à-dire un chemin local. P>
J'ai passé beaucoup de temps à essayer de résoudre ce problème jusqu'à ce que je rencontre votre réponse ici. Merci Internet Stranger. Cela a aidé beaucoup.
Utilisez Avplayer pour diffuser audio / vidéo sur la base de l'URL HTTP. Cela fonctionnera bien. Avaudioplayer est pour les fichiers locaux. Voici le code
NSURL *url = [NSURL URLWithString:url]; self.avAsset = [AVURLAsset URLAssetWithURL:url options:nil]; self.playerItem = [AVPlayerItem playerItemWithAsset:avAsset]; self.audioPlayer = [AVPlayer playerWithPlayerItem:playerItem]; [self.audioPlayer play];
Utilisez Voici un exemple fonctionnant, espérons que ce serait utile. p> Avplayer code> et surveiller son statut pour lancer la lecture.
@implementation AudioStream
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
if (context == PlayerStatusContext) {
AVPlayer *thePlayer = (AVPlayer *)object;
switch ([thePlayer status]) {
case AVPlayerStatusReadyToPlay:
NSLog(@"player status ready to play");
[thePlayer play];
break;
case AVPlayerStatusFailed:
NSLog(@"player status failed");
break;
default:
break;
}
return;
} else if (context == ItemStatusContext) {
AVPlayerItem *thePlayerItem = (AVPlayerItem *)object;
switch ([thePlayerItem status]) {
case AVPlayerItemStatusReadyToPlay:
NSLog(@"player item ready to play");
break;
case AVPlayerItemStatusFailed:
NSLog(@"player item failed");
break;
default:
break;
}
return;
}
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
- (void)playAudioStream
{
NSURL *audioUrl = [NSURL URLWithString:@"your_stream_url"];
AVURLAsset *audioAsset = [AVURLAsset assetWithURL:audioUrl];
AVPlayerItem *audioPlayerItem = [AVPlayerItem playerItemWithAsset:audioAsset];
[audioPlayerItem addObserver:self forKeyPath:@"status" options:0 context:ItemStatusContext];
self.player = [AVPlayer playerWithPlayerItem:audioPlayerItem];
[self.player addObserver:self forKeyPath:@"status" options:0 context:PlayerStatusContext];
}
@end
Avez-vous essayé de fournir un objet d'erreur pour voir s'il contient une description d'erreur?
Nope, mais l'application ne se bloque pas non plus ... juste la vue apparaît et rien ne se passe.