0

iOS の問題: audioqueue を使用して再生値を変更する

最近、私は audioqueue を使用して ( avplayer を使用せずに) 音楽プレーヤーを作成しました。プレーヤーはローカル オーディオ ファイルを再生しますが、インターネット ファイルは再生しません。ユーザーが再生の進行状況をスライダーで変更できる機能を実現したいと考えています。どうすればよいですか? 要するに、オーディオキューを使用して、ローカルファイルを再生するときにスライド再生の進行状況を達成するにはどうすればよいですか。

いくつかの重要なコードであなたの答えを願っています!

-------------------------------追記---------------------- -
オーディオストリーマーのデモ (URL: http://code4app.net/ios/Audio-Streamer/5019d9066803faa344000000 ) のコードを変更します。私の考えは大まかに次のとおりです。
1、ローカルの音楽ファイルでストリームを開く。
2、AudioFileStreamID Obj(audioFileStream)を作成します。
3、コールバック ASPacketsProc でキューを作成します。
4、createqueue の後、コールバック ASPacketsProc でキューのバッファを埋めます。
5、最後に関数を呼び出して再生を開始します。

一部のコードは次のとおりです。

- (void) openReadStream {
  CFURLRef urlPath = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filePath, kCFURLPOSIXPathStyle, false);
    stream = CFReadStreamCreateWithFile(kCFAllocatorSystemDefault, urlPath);

    if (CFReadStreamOpen(stream))
    {
        CFStreamClientContext context = {0, self, NULL, NULL, NULL};
        CFReadStreamSetClient(
        stream,
        kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
        ASReadStreamCallBack,
        &context);
        CFReadStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
    }
}

static void ASReadStreamCallBack (CFReadStreamRef aStream, CFStreamEventType eventType,void* inClientInfo)
{
    AudioStreamer* streamer = (AudioStreamer *)inClientInfo;
    [streamer handleReadFromStream:aStream eventType:eventType];

}

AudioFileStreamOpen(self,ASPropertyListenerProc,ASPacketsProc,fileTypeHint,&audioFileStream);

- (void)createQueue {
    sampleRate = asbd.mSampleRate;
    packetDuration = asbd.mFramesPerPacket / sampleRate;

    // create the audio queue
    AudioQueueNewOutput(&asbd, ASAudioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue);

    // listen to the "isRunning" property
    AudioQueueAddPropertyListener(audioQueue, kAudioQueueProperty_IsRunning, ASAudioQueueIsRunningCallback, self);

    // get the packet size if it is available
    UInt32 sizeOfUInt32 = sizeof(UInt32);
    AudioFileStreamGetProperty(audioFileStream, kAudioFileStreamProperty_PacketSizeUpperBound, &sizeOfUInt32, &packetBufferSize);

    for (unsigned int i = 0; i < kNumAQBufs; ++i)
    {
    AudioQueueAllocateBuffer(audioQueue, packetBufferSize, &audioQueueBuffer[i]);

    }

}

AudioQueueEnqueueBuffer(audioQueue, fillBuf, packetsFilled, packetDescs);

AudioQueueStart(audioQueue, NULL);
4

1 に答える 1

0

MPMusicPlayerControllerクラスを使用したと思います。コードが必要な場合は、データまたはコードも提供する必要があります。どのクラスを使用しているかわかりません...

ただし、これを使用すると、スライダーが変更されたときに currentPlaybackTime プロパティを設定できます。

たとえば、次のインスタンスがあるとします。

@property (nonatomic, strong) MPMusicPlayerController *musicPlayer;

次に、おそらく、次のように再生時間を変更できます。

- (IBAction)sliderChanged:(id)sender
{
    self.musicPlayer.currentPlaybackTime = self.slider.value;
}
于 2013-09-03T06:54:52.613 に答える