0

Ich entwickle Musik-Anwendung, in der ich konvertierten Song in "Document-Verzeichnis" für die spätere Verwendung speichern müssen. Aus irgendeinem Grund spielt es nicht von der gespeicherten Verzeichnis-URL ab, aber ich bekomme auch keinen Fehler. Ich habe im Verzeichnis nachgesehen und den gleichen gespeicherten Song gefunden.Songs nicht konsistent von Gerät lokalen Dokument URL zu AVAudioPlayer

Dieselbe Song-URL wurde bereits erfolgreich im Verzeichnis gespielt.

Mein Code zum Speichern von Song nach der Konvertierung von MP3 nach M4a.

{ 
NSURL *assetURL = [NSURL URLWithString:_assertURL]; 
    AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 

    /* approach 1: export just the song itself 
    */ 
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] 
             initWithAsset: songAsset 
             presetName: AVAssetExportPresetAppleM4A]; 
    NSLog (@"created exporter. supportedFileTypes: %@", exporter.supportedFileTypes); 
    exporter.outputFileType = @"com.apple.m4a-audio"; 
    NSString *exportFile = [myDocumentsM4aDirectory() stringByAppendingPathComponent: [NSString stringWithFormat:@"%@.m4a",_title]]; 
    // end of approach 1 

    // set up export (hang on to exportURL so convert to PCM can find it) 
    [self myDeleteFile:exportFile]; 
    //[exportURL release]; 
    _exportURL = [NSURL fileURLWithPath:exportFile]; 
    exporter.outputURL = _exportURL; 

    // do the export 
    [exporter exportAsynchronouslyWithCompletionHandler:^{ 
     int exportStatus = exporter.status; 
     switch (exportStatus) { 
      case AVAssetExportSessionStatusFailed: { 
       // log error to view 
       NSError *exportError = exporter.error; 
       NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError); 

       break; 
      } 
      case AVAssetExportSessionStatusCompleted: { 
       NSLog (@"AVAssetExportSessionStatusCompleted"); 

//Final document url 

       NSURL *audioUrl = _exportURL; 
       NSLog(@"Audio Url=%@",audioUrl); 


       break; 
      } 
      case AVAssetExportSessionStatusUnknown: { 
       NSLog (@"AVAssetExportSessionStatusUnknown"); 


       break; 
      } 
      case AVAssetExportSessionStatusExporting: { 
       NSLog (@"AVAssetExportSessionStatusExporting"); 


       break; 
      } 
      case AVAssetExportSessionStatusCancelled: { 
       NSLog (@"AVAssetExportSessionStatusCancelled"); 


       break; 
      } 
      case AVAssetExportSessionStatusWaiting: { 
       NSLog (@"AVAssetExportSessionStatusWaiting"); 

       break; 
      } 
      default: { 
       NSLog (@"didn't get export status"); 


       break; 
      } 
     } 
    }]; 

} 

Löschen der bestehenden Datei, die im aktuellen Pfad zur Verfügung:

- (void)myDeleteFile:(NSString*)path{ 

    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { 
     NSError *deleteErr = nil; 
     [[NSFileManager defaultManager] removeItemAtPath:path error:&deleteErr]; 
     if (deleteErr) { 
      NSLog (@"Can't delete %@: %@", path, deleteErr); 
     } 
    } 

} 

Dies ist Code verwendet m4a Verzeichnis zu erstellen:

NSString* myDocumentsM4aDirectory(){ 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSError *error = nil; 
    NSString *dataPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"/m4aFolder"]; 

    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) 
     [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; 
    //Create folde 
    return dataPath; 


} 

Wie dieses Problem, um herauszufinden, lokal zu spielen gespeicherte Song dauerhaft?

EDIT:

// Diese unten Funktion aufzurufen Song

- (void)playSong 
{ 
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:_exportURL] options:nil]; 
NSError *error = nil; 
AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:asset.URL error:&error]; 
if(error == nil) 
{ 
[player play] 
}else 
{ 
NSLog (@"Error during playing: %@", error); 
} 

} 

Danke,

Antwort zu spielen: fand ich die Lösung für die Songs nicht aus dem Dokument zu spielen, Grund, warum ich bin zuvor Speichern der gesamten Asser-URL zu Kerndaten. Die ID des Dokuments "xxxxxx-xxxxxxx-xxxxxxx-xxxxxxxxx" ändert sich bei jedem Start weiter.

Also, ich hole den Assert-Pfad basierend auf dem Titel und der Erweiterung, die ich an die URL zuvor angehängt wurde. Jetzt funktioniert es gut.

Dies beantwortet geholfen, dieses Problem zu beheben: Play local audio file with AVAudioPlayer

+0

Können Sie den Code, wo Sie spielen, aus dem Dokumentenwörterbuch –

+0

bereitstellen? Hier finden Sie das bearbeitete Code-Snippet zum Abspielen des exportierten Songs. –

Antwort

0
You can play song directly from document directory 

url = [NSURL fileURLWithPath:strFilePath]; 

     NSError *error; 
     if(mp3player) 
     { 
      mp3player = nil; 
     } 
     mp3player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
     mp3player.delegate = self; 
     [mp3player setVolume:1.0]; 
     mp3player.numberOfLoops = 0; 
     [mp3player prepareToPlay]; 
     [mp3player play]; 

Hinweis:

definieren "mp3player" in h-Datei.

+0

Noch bekomme ich Fehler: NSOSStatusErrorDomain Code = 2003334207 "(null)" nach dem Ändern nach Ihrem Code –