2015-07-01 2 views
1

Я сохраняю аудиоданные в каталоге Документы и пытаюсь их прочитать. Если я воспроизведу его сразу же, он будет успешно воспроизводиться, однако, если я начну новый сеанс и попытаюсь воспроизвести песню локально, это не удастся, даже если перечисление файлов в каталоге «Документы» показывает, что мой файл все еще существует. Обратите внимание, что файл воспроизводится из папки «Документы» одинаково (тот же код), если он воспроизводится сразу или во время нового сеанса.iOS - чтение аудиофайла из каталога документов

Вот как я сохранить аудиоданные в каталог документов:

+(void)writeDataToAudioFile:(NSData*)data forTrack:(MediaItem*)track 
{ 
    // filename looks like "[track_id].mp3" 
    NSString *fileName = [NSString stringWithFormat:@"%@.%@",track.sc_id,track.original_format]; 

    NSString *pathName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                    NSUserDomainMask, 
                    YES) firstObject] 
          stringByAppendingPathComponent:fileName]; 

    [[NSFileManager defaultManager] createFileAtPath:pathName 
              contents:data 
              attributes:nil]; 
} 

Тогда в моей музыкальный плеер, я хочу, чтобы загрузить локальный URL для этого файла, чтобы инициализировать AVPlayer:

NSURL *url; 
    if(_currentTrack.is_local_item) 
    { 
      url = [NSURL fileURLWithPath:_currentTrack.local_file_path]; 
    } 

URL не создается должным образом, так как AVPlayer не воспроизводится. Кроме того, я пробовал каждый другой способ загрузить файл как данные в объект NSData, чтобы проверить размер байта, но пытаюсь получить доступ к файлу, поскольку данные всегда возвращают нуль. Тем не менее, файл существует, как если бы я использовал NSFileManager. Я могу перебирать элементы в каталоге «Документы» и печатать имена файлов/пути, проверяя, что путь, который я сохранил в «_currentTrack.local_file_path», существует. Опять же, если я воспроизведу файл сразу после сохранения файла на диск, он будет воспроизводиться.

Если есть больше информации, я могу предоставить, чтобы сделать это яснее. Большое спасибо.

+0

«пытается получить доступ к файлу, поскольку данные всегда возвращают нуль». Это проблема, над которой работать. Начните с предположения, что 'NSData' всегда работает. Получите размер файла с помощью NSFileManager. Также запишите путь как время сохранения, так и время загрузки. Добавьте к вопросу вопрос, а затем посмотрите на каталог в Finder, если он запущен на симуляторе. Лучше всего создать небольшой метод для возврата пути к файлу, который устраняет возможные ошибки. В настоящее время кажется, что вы сохраняете путь и загружаете URL-адрес, а не отличную концепцию правильности. Плюс меньше кода и отсутствие дублирования - это хорошо. – zaph

ответ

0

Я нашел решение, поставив проблему на несколько дней. Я сломался и распечатал сообщение о программе, и я обнаружил, что путь к файлу, который я сохранял, был не таким же, как путь к файлу файла.

Я думаю, что это была проблема симулятора, поскольку проблема возникала только между различными сеансами симулятора и работала в одном сеансе, поэтому идентификатор устройства (который является частью абсолютного пути) менялся - может быть, кто-то еще знающий может взвесить на этом.

Обратите внимание на строковые значения ваших переменных.

1

Не записывайте полный путь к базе данных в DB. Это изменится. Вам нужно сохранить имя файла только в качестве ссылки. Затем используйте следующее:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; 
NSString *fileName = @"SAVED_FILE_NAME.mp3"; // eg: [track_id].mp3 
NSString *filePath = [documentsPath stringByAppendingPathComponent:fileName]; 

Это предоставит вам фактический путь к файлу.

Продолжить кодирование ........... :)

Смежные вопросы