3

ストリーミング アプリに AudioFileStreamSeek 機能を実装しようとしています。しかし、これを実行する方法はありません。Matt Gallagherでさえ、彼のブログで次のように述べています。

偶然にも、AudioFileStreamSeek 関数は完全に壊れているようです。ファイル内の新しいポイントをシークするだけで機能しない場合 (私はできませんでした)、discontinuous を 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;
        }
    }

助けてください...

4

1 に答える 1

3

他の解決策がない場合、できることは NSConnection を作成することです。次に、NSData を受け取ると、受け取った NSData の新しいチャンクをそれぞれ NSConnectionDelegate に処理することで、効果的にストリーミングを作成できます。NSConnection は必ず順番どおりに送信するので、正しく注文されるかどうか心配する必要はありません。ただし、アプリケーションによっては、メイン アプリケーション スレッドの外でこれを行う必要がある場合があることに注意してください。これにより、ダウンロードが停止し、再バッファリングが必要になった場合でも、ユーザーは引き続きアプリケーションを操作できます。

于 2009-09-11T13:35:24.577 に答える