iPhone開発者フォーラムの「SpeakHere」サンプルコードを解析しました。
次のように AudioQueue を開始するためのコードがあります。
AudioTimeStamp ats = {0};
AudioQueueStart(mQueue, &ats);
しかし、ファイルの途中で開始する方法がわかりません。
負を含むさまざまな値で AudioTimeStamp を変更しました。しかし、それは機能しません。
あなたの素晴らしい意見を教えてください。ありがとう。
iPhone開発者フォーラムの「SpeakHere」サンプルコードを解析しました。
次のように AudioQueue を開始するためのコードがあります。
AudioTimeStamp ats = {0};
AudioQueueStart(mQueue, &ats);
しかし、ファイルの途中で開始する方法がわかりません。
負を含むさまざまな値で AudioTimeStamp を変更しました。しかし、それは機能しません。
あなたの素晴らしい意見を教えてください。ありがとう。
AudioQueueStart
それを行うのに役立つ機能ではありません。遅延のような時間があります。NULL を渡すと、キューができるだけ早く開始されることを意味します。
再生したいフレームを渡してキューに入れ、ファイルのフレーム数と再生したい(相対的な)位置を知る必要があることを計算する必要があります。
これらは、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
が使用され、それが上記のメソッドで調整したものであるため、再生したい部分が読み取られ、キューに入れられ、最終的に再生されます:)
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 の場合は途中から再生されます。
お役に立てれば。