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
Können Sie den Code, wo Sie spielen, aus dem Dokumentenwörterbuch –
bereitstellen? Hier finden Sie das bearbeitete Code-Snippet zum Abspielen des exportierten Songs. –