如何使用AudioQueue从特定位置启动音频文件?

cno*_*ook 3 iphone audioqueue

我分析了iPhone dev论坛的"SpeakHere"示例代码.

有一个启动AudioQueue的代码,如下所示..

AudioTimeStamp ats = {0};
AudioQueueStart(mQueue, &ats);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何开始文件中间.

我更改了AudioTimeStamp,其中包含各种值为负数.但它不起作用.

请让我知道你的好评.谢谢.

nac*_*o4d 6

AudioQueueStart不是帮助你做到这一点的功能.像延迟一样的时间,如果你传递NULL然后它意味着队列将尽快启动.

您必须传递要播放的帧并将其排队,以计算您必须知道文件具有的帧数和您想要播放的(相对)位置.

这些是如何在SpeakHere中制作它的说明

在新的(基于objc ++)SpeakHere

在AQPlayer.h中添加一个私有实例变量:

UInt64 mPacketCount;
Run Code Online (Sandbox Code Playgroud)

和公共方法:

void SetQueuePosition(float position) { mCurrentPacket = mPacketCount*position; };
Run Code Online (Sandbox Code Playgroud)

在AQPlayer.mm里面添加AQPlayer::SetupNewQueue()之前mIsInitialized = true;:

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

现在你必须使用它(在SpeakHereControler.mm中添加它并将其链接到UISlider例如):

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

为什么这样有效:

回放函数AudioQueueOutputCallback为队列提供新数据包,新SpeakHere是:void AQPlayer::AQBufferCallback( , , )调用AudioFileReadPackets读取和排队文件的某个部分.因为使用了这个任务mCurrentPacket,这就是我们刚刚在上面的方法中调整的内容,因此您想要播放的部分是读取,排队并最终播放的:)


只是出于历史原因:)

在旧的(基于objc)SpeakHere

在AudioPlayer.h中添加一个实例变量:

UInt64      totalFrames;
Run Code Online (Sandbox Code Playgroud)

AudioPlayer.m里面 - (void)openPlaybackFile:(CFURLRef)soundFile add:

UInt32 sizeOfTotalFrames = sizeof(UInt64);
AudioFileGetProperty (                        
          [self audioFileID], 
          kAudioFilePropertyAudioDataPacketCount,
          &sizeOfTotalFrames,
          &totalFrames
          );
Run Code Online (Sandbox Code Playgroud)

然后向AudioPlayer.h和.m添加一个方法

- (void) setRelativePlaybackPosition: (float) position 
{
    startingPacketNumber = totalFrames * position;
}
Run Code Online (Sandbox Code Playgroud)

现在你必须使用它(在AudioViewController中添加它并将其链接到UISlider例如):

- (IBAction) setPlaybackPosition: (UISlider *) sender
{
    float value = [sender value];
    [audioPlayer setRelativePlaybackPosition: value];
}
Run Code Online (Sandbox Code Playgroud)

当值为0时,您将从开始播放,从中间播放0.5等.


希望这可以帮助.