我分析了iPhone dev论坛的"SpeakHere"示例代码.
有一个启动AudioQueue的代码,如下所示..
AudioTimeStamp ats = {0};
AudioQueueStart(mQueue, &ats);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何开始文件中间.
我更改了AudioTimeStamp,其中包含各种值为负数.但它不起作用.
请让我知道你的好评.谢谢.
AudioQueueStart不是帮助你做到这一点的功能.像延迟一样的时间,如果你传递NULL然后它意味着队列将尽快启动.
您必须传递要播放的帧并将其排队,以计算您必须知道文件具有的帧数和您想要播放的(相对)位置.
这些是如何在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,这就是我们刚刚在上面的方法中调整的内容,因此您想要播放的部分是读取,排队并最终播放的:)
在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等.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
1242 次 |
| 最近记录: |