Как я могу использовать fileHandle на iPhone для загрузки mp3-файла "на лету"?
-
20-09-2019 - |
Вопрос
Я пытаюсь реализовать функцию AudioFileStreamSeek в моем потоковом приложении.Но я никак не могу запустить это дело.Даже Мэтт Галлахер сказал в своем блоге:
К сожалению, функция AudioFileStreamSeek, похоже, полностью нарушена.Если вы не можете заставить это работать (как я не смог), просто найдите новую точку в файле, установите для discontinuous значение true и позвольте AudioFileStream разобраться с этим.
Мой код kindda выглядит примерно так, но я не могу заставить его работать:
NSString *path = [[NSString alloc] initWithContentsOfURL: url];
NSLog(@"url = %@", path);
SInt64 currentOffset;
UInt32 flags = 0;
OSStatus status = AudioFileStreamSeek( audioFileStream, 150, ¤tOffset, &flags );
NSLog(@"Setting next byte offset to: %qi, flags: %d", (long long)currentOffset, flags);
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath: path];
// then read data from the new offset set by AudioFileStreamSeek
[fileHandle seekToFileOffset:currentOffset];
NSData * data = [fileHandle readDataOfLength:4096];
NSLog(@"data length %d, bytes %d", [data length], [data bytes]);
if (discontinuous)
{
err = AudioFileStreamParseBytes(audioFileStream, length, bytes, kAudioFileStreamParseFlag_Discontinuity);
if (err)
{
[self failWithErrorCode:AS_FILE_STREAM_PARSE_BYTES_FAILED];
return;
}
}
else
{
err = AudioFileStreamParseBytes(audioFileStream, length, bytes, 0);
if (err)
{
[self failWithErrorCode:AS_FILE_STREAM_PARSE_BYTES_FAILED];
return;
}
}
Пожалуйста, помогите...
Решение
При отсутствии каких-либо других решений, что вы можете сделать, это создать NSConnection, а затем по мере получения NSData вы можете эффективно создавать потоковую передачу, обрабатывая каждый новый фрагмент NSData, который вы получаете, в свой NSConnectionDelegate.NSConnection позаботится о том, чтобы отправить его вам по порядку, так что вам не придется беспокоиться о правильном заказе.Однако обратите внимание, что, в зависимости от вашего приложения, вам может потребоваться сделать это вне основного потока приложения, чтобы пользователь мог по-прежнему работать с вашим приложением, даже если загрузка остановится и вам придется отказаться.