На iPhone, как я могу использовать fileHandle для загрузки mp3-файла на лету? - PullRequest
3 голосов
/ 28 августа 2009

Я пытаюсь реализовать функцию AudioFileStreamSeek в моем потоковом приложении. Но я никак не могу это запустить. Даже Мэтт Галлахер сказал в своем блоге:

Между прочим, функция AudioFileStreamSeek кажется полностью неработающей. Если вы не можете заставить его работать (как я не смог), просто ищите новую точку в файле, установите для прерывистого значения значение true и разрешите AudioFileStream справиться с этим.

Мой код выглядит так, но я не могу заставить его работать:

    NSString *path = [[NSString alloc] initWithContentsOfURL: url];

    NSLog(@"url = %@", path);
    SInt64 currentOffset;
    UInt32 flags = 0;

    OSStatus status = AudioFileStreamSeek( audioFileStream, 150, &currentOffset, &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;
        }
    }

Пожалуйста, помогите ...

1 Ответ

3 голосов
/ 11 сентября 2009

В отсутствие каких-либо других решений вы можете создать NSConnection, а затем, получив NSData, вы можете эффективно создавать потоковую передачу, обрабатывая каждый новый фрагмент NSData, полученный вами, в ваш NSConnectionDelegate. NSConnection обязательно отправит его вам по порядку, поэтому вам не придется беспокоиться о правильном заказе. Обратите внимание, что, в зависимости от вашего приложения, вам может потребоваться сделать это вне основного потока приложения, чтобы пользователь мог по-прежнему работать с вашим приложением, даже если загрузка останавливается и вам приходится делать буфер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...