web-dev-qa-db-fra.com

AVPlayer et fichiers locaux

Je construis un lecteur MP3 pour iOS qui lit les fichiers audio hébergés sur le Web. Je veux offrir la possibilité de lire les fichiers hors ligne, j'ai donc le téléchargement de fichiers en utilisant ASIHTTP mais je ne peux pas sembler trouver des informations sur l'initialisation d'AVPlayer avec un mp3 dans le répertoire des documents de l'application. Quelqu'un a-t-il déjà fait cela? Est-ce même possible?

* J'ai posté une réponse ci-dessous qui montre comment utiliser iOS AvPlayer pour les fichiers locaux et http. J'espère que cela t'aides!

20
stitz

J'ai décidé de répondre à ma propre question car je pensais qu'il y avait très peu de documentation sur la façon d'utiliser le AV Apple fourni AVPlayer pour les fichiers locaux et de flux (sur http). Pour aider à comprendre la solution, J'ai mis en place un exemple de projet sur GitHub dans Objective-C et Swift Le code ci-dessous est Objective-C mais vous pouvez télécharger mon Swift exemple pour voir ça. C'est très similaire!

Ce que j'ai trouvé, c'est que les deux façons de configurer les fichiers sont presque identiques, sauf pour la façon dont vous instanciez votre NSURL pour la chaîne Asset> PlayerItem> AVPlayer.

Voici un aperçu des principales méthodes

Fichier .h (code partiel)

-(IBAction) BtnGoClick:(id)sender;
-(IBAction) BtnGoLocalClick:(id)sender;
-(IBAction) BtnPlay:(id)sender;
-(IBAction) BtnPause:(id)sender;
-(void) setupAVPlayerForURL: (NSURL*) url;

Fichier .m (code partiel)

-(IBAction) BtnGoClick:(id)sender {

    NSURL *url = [[NSURL alloc] initWithString:@""];

    [self setupAVPlayerForURL:url];
}

-(IBAction) BtnGoLocalClick:(id)sender {

    // - - - Pull media from documents folder

    //NSString* saveFileName = @"MyAudio.mp3";
    //NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //NSString *documentsDirectory = [paths objectAtIndex:0];
    //NSString *path = [documentsDirectory stringByAppendingPathComponent:saveFileName];

    // - - -

    // - - - Pull media from resources folder

    NSString *path = [[NSBundle mainBundle] pathForResource:@"MyAudio" ofType:@"mp3"];

    // - - -

    NSURL *url = [[NSURL alloc] initFileURLWithPath: path];

    [self setupAVPlayerForURL:url];
}

-(void) setupAVPlayerForURL: (NSURL*) url {
    AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    AVPlayerItem *anItem = [AVPlayerItem playerItemWithAsset:asset];

    player = [AVPlayer playerWithPlayerItem:anItem];
    [player addObserver:self forKeyPath:@"status" options:0 context:nil];
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if (object == player && [keyPath isEqualToString:@"status"]) {
        if (player.status == AVPlayerStatusFailed) {
            NSLog(@"AVPlayer Failed");
        } else if (player.status == AVPlayerStatusReadyToPlay) {
            NSLog(@"AVPlayer Ready to Play");
        } else if (player.status == AVPlayerItemStatusUnknown) {
            NSLog(@"AVPlayer Unknown");
        }
    }
}

-(IBAction) BtnPlay:(id)sender {
    [player play];
}

-(IBAction) BtnPause:(id)sender {
    [player pause];
}

Consultez le code source d'Objective-C pour un exemple de travail. J'espère que cela t'aides!

-Mise à jour 12/7/2015 J'ai maintenant un exemple Swift du code source que vous pouvez voir ici .

34
stitz

J'ai obtenu AVPlayer de travailler avec l'URL locale en ajoutant file:// à mon URL locale

NSURL * localURL = [NSURL URLWithString:[@"file://" stringByAppendingString:YOUR_LOCAL_URL]];
AVPlayer * player = [[AVPlayer alloc] initWithURL:localURL];
13
Sudo

Essaye ça

NSString*thePath=[[NSBundle mainBundle] pathForResource:@"yourVideo" ofType:@"MOV"];
NSURL*theurl=[NSURL fileURLWithPath:thePath];
3
ZaEeM ZaFaR

Oui, il est possible de télécharger et d'enregistrer le .mp3 (ou tout autre type de fichier) dans le répertoire NSDocument, puis vous pouvez y revenir et jouer en utilisant AVAudioPlayer.

NSString *downloadURL=**your url to download .mp3 file**

NSURL *url = [NSURLURLWithString:downloadURL];

NSURLConnectionalloc *downloadFileConnection = [[[NSURLConnectionalloc] initWithRequest:      [NSURLRequestrequestWithURL:url] delegate:self] autorelease];//initialize NSURLConnection

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,  YES) objectAtIndex:0];

NSString *fileDocPath = [NSStringstringWithFormat:@"%@/",docDir];//document directory path

[fileDocPathretain];

NSFileManager *filemanager=[ NSFileManager defaultManager ];

NSError *error;

if([filemanager fileExistsAtPath:fileDocPath])
{

//just check existence of files in document directory
}

NSURLConnection is used to download the content.NSURLConnection Delegate methods are used to  support downloading.

(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSFileManager *filemanager=[NSFileManagerdefaultManager];
if(![filemanager fileExistsAtPath:filePath])
{
[[NSFileManagerdefaultManager] createFileAtPath:fileDocPath contents:nil attributes:nil];

}
NSFileHandle *handle = [NSFileHandlefileHandleForWritingAtPath:filePath];

[handle seekToEndOfFile];

[handle writeData:data];

[handle closeFile];
 }

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 {
 UIAlertView *alertView=[[UIAlertViewalloc]initWithTitle:@”"message:
 [NSStringstringWithFormat:@"Connection failed!\n Error - %@ ", [error localizedDescription]]   delegate:nilcancelButtonTitle:@”Ok”otherButtonTitles:nil];
  [alertView show];
  [alertView release];
  [downloadFileConnectioncancel];//cancel downloding
  }

Récupérez l'audio et la lecture téléchargés:

   NSString *docDir1 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,   NSUserDomainMask, YES) objectAtIndex:0];

   NSString *myfilepath = [docDir1 stringByAppendingPathComponent:YourAudioNameinNSDOCDir];

   NSLog(@”url:%@”,myfilepath);

   NSURL *AudioURL = [[[NSURLalloc]initFileURLWithPath:myfilepath]autorelease];

Écrivez simplement votre code pour lire l'audio en utilisant AudioURL

J'aime savoir si vous avez des éclaircissements à cet égard.

Je vous remercie

3
iphonecool

il est très difficile de jouer une chanson en utilisant un Avplayer pourquoi vous n'utilisez pas un lecteur MPMoviePlayerController. j'ai jouer la chanson du répertoire du document. je publie un code pls référez-vous. cela fonctionne bien. et aussi u directement à partir de l'url en direct.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *publicDocumentsDir = [paths objectAtIndex:0];   
NSString *dataPath = [publicDocumentsDir stringByAppendingPathComponent:@"Ringtone"];
NSString *fullPath = [dataPath stringByAppendingPathComponent:[obj.DownloadArray objectAtIndex:obj.tagvalue]];
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];


NSURL *url = [NSURL fileURLWithPath:fullPath];

videoPlayer =[[MPMoviePlayerController alloc] initWithContentURL: url];
[[videoPlayer view] setFrame: [self.view bounds]]; 
[vvideo addSubview: [videoPlayer view]];


videoPlayer.view.frame=CGRectMake(0, 0,260, 100);
videoPlayer.view.backgroundColor=[UIColor clearColor];
videoPlayer.controlStyle =   MPMovieControlStyleFullscreen;
videoPlayer.shouldAutoplay = YES;  
[videoPlayer play];
videoPlayer.repeatMode=YES;


NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(moviePlayerEvent:) name:MPMoviePlayerLoadStateDidChangeNotification object:videoPlayer];


/*  NSNotificationCenter *notificationCenter1 = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(moviePlayerEvent1:) name:MPMoviePlaybackStateStopped object:videoPlayer];
*/
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(playbackStateChange:)
                                             name:MPMoviePlayerLoadStateDidChangeNotification
                                           object:videoPlayer];
}

-(void)playbackStateChange:(NSNotification*)notification{

if([[UIApplication sharedApplication]respondsToSelector:@selector(setStatusBarHidden: withAnimation:)])
  { 
      [[UIApplication sharedApplication] setStatusBarHidden:NO 
                                            withAnimation:UIStatusBarAnimationNone];
   }
  else 
   {

       [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
   }
}

 -(void)moviePlayerEvent:(NSNotification*)aNotification{


   [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO];


}

  -(void)moviePlayerEvent1:(NSNotification*)aNotification{

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO];

 }
1
parag

Version de lecture locale rapide, en supposant que j'ai un fichier "shel.mp3" dans mon bundle:

@IBAction func button(_ sender: Any?) {
    guard let url = Bundle.main.url(forResource: "shelter", withExtension: "mp3") else {
        return
    }

    let player = AVPlayer(url: url)

    player.play()
    playerView?.player = player;
}

Voir ici pour plus de détails sur playerView ou la lecture d'une URL distante.

0
owenfi