3

iPhone開発者フォーラムの「SpeakHere」サンプルコードを解析しました。

次のように AudioQueue を開始するためのコードがあります。

AudioTimeStamp ats = {0};
AudioQueueStart(mQueue, &ats);

しかし、ファイルの途中で開始する方法がわかりません。

負を含むさまざまな値で AudioTimeStamp を変更しました。しかし、それは機能しません。

あなたの素晴らしい意見を教えてください。ありがとう。

4

1 に答える 1

6

AudioQueueStartそれを行うのに役立つ機能ではありません。遅延のような時間があります。NULL を渡すと、キューができるだけ早く開始されることを意味します。

再生したいフレームを渡してキューに入れ、ファイルのフレーム数と再生したい(相対的な)位置を知る必要があることを計算する必要があります。

これらは、SpeakHere での作成方法の説明です。

新しい (objc++ ベースの) SpeakHere

AQPlayer.h で、プライベート インスタンス変数を追加します。

UInt64 mPacketCount;

およびパブリック メソッド:

void SetQueuePosition(float position) { mCurrentPacket = mPacketCount*position; };

AQPlayer::SetupNewQueue()追加する前にAQPlayer.mm 内にmIsInitialized = true;:

// get the total number of packets
UInt32 sizeOfPacketsCount = sizeof(mPacketCount);
XThrowIfError (AudioFileGetProperty (mAudioFile, kAudioFilePropertyAudioDataPacketCount, &sizeOfPacketsCount, &mPacketCount), "get packet count");

これを使用する必要があります (たとえば、SpeakHereControler.mm でこれを追加し、UISlider にリンクします)。

- (IBAction) sliderValueChanged:(UISlider *) sender
{
    float value = [sender value];
    player->SetQueuePosition(position);
}

これが機能する理由:

再生コールバック関数 AudioQueueOutputCallback はキューに新しいパケットを供給し、新しい SpeakHere では:ファイルの特定の部分を読み取ってキューに入れるためのvoid AQPlayer::AQBufferCallback( , , )呼び出し。AudioFileReadPacketsそのタスクmCurrentPacketが使用され、それが上記のメソッドで調整したものであるため、再生したい部分が読み取られ、キューに入れられ、最終的に再生されます:)


歴史的な理由から:)

古い (objc ベースの) SpeakHere では

AudioPlayer.h にインスタンス変数を追加します。

UInt64      totalFrames;

AudioPlayer.m 内部 - (void) openPlaybackFile: (CFURLRef) soundFile add:

UInt32 sizeOfTotalFrames = sizeof(UInt64);
AudioFileGetProperty (                        
          [self audioFileID], 
          kAudioFilePropertyAudioDataPacketCount,
          &sizeOfTotalFrames,
          &totalFrames
          );

次に、AudioPlayer.h と .m にメソッドを追加します。

- (void) setRelativePlaybackPosition: (float) position 
{
    startingPacketNumber = totalFrames * position;
}

これを使用する必要があります (たとえば、AudioViewController でこれを追加して UISlider にリンクします)。

- (IBAction) setPlaybackPosition: (UISlider *) sender
{
    float value = [sender value];
    [audioPlayer setRelativePlaybackPosition: value];
}

値が 0 の場合は最初から再生され、0.5 の場合は途中から再生されます。


お役に立てれば。

于 2010-07-25T11:54:23.743 に答える