gpt4 book ai didi

iphone - 如何使用 AudioQueue 从某个位置启动音频文件?

转载 作者:行者123 更新时间:2023-12-03 19:37:48 26 4
gpt4 key购买 nike

我分析了iPhone开发论坛的“SpeakHere”示例代码。

启动 AudioQueue 的代码如下..

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

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

我用各种值(包括负值)更改了 AudioTimeStamp。但它不起作用。

请告诉我您的宝贵意见。谢谢。

最佳答案

AudioQueueStart 不是可以帮助您执行此操作的函数。时间就像一个延迟,如果传递NULL则意味着队列将尽快启动。

您必须传递要播放的帧并将其排入队列,以计算您必须知道文件的帧数以及要播放的(相对)位置。

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

在新的(基于 objc++)SpeakHere

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

UInt64 mPacketCount;

和一个公共(public)方法:

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

在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");

现在您必须使用它(例如,在 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添加:

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 时从中间播放,依此类推。


希望这会有所帮助。

关于iphone - 如何使用 AudioQueue 从某个位置启动音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3328911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com