ios问题:使用audioqueue改变播放值
最近,我制作了一个带有audioqueue的音乐播放器(不使用avplayer),播放器播放本地音频文件但不播放互联网文件。现在我想实现一个功能,用户可以通过滑块改变播放进度。我怎么能做? 简而言之,如何在播放本地文件时使用audioqueue实现幻灯片播放进度。
用一些重要的代码祝你的回答!
---------------------------追加------------------- ----
我修改了音频流的演示中的代码(URL:http://code4app.net/ios/Audio-Streamer/5019d9066803faa344000000),我的思路如下:
1,用本地音乐文件打开流
2,创建一个AudioFileStreamID Obj(audioFileStream)
3,在回调ASPacketsProc中创建队列
4,在createqueue之后,然后在回调ASPacketsProc中填充队列的缓冲区
5,最后,我将调用该函数开始播放。
有些代码如下:
- (void) openReadStream {
CFURLRef urlPath = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filePath, kCFURLPOSIXPathStyle, false);
stream = CFReadStreamCreateWithFile(kCFAllocatorSystemDefault, urlPath);
if (CFReadStreamOpen(stream))
{
CFStreamClientContext context = {0, self, NULL, NULL, NULL};
CFReadStreamSetClient(
stream,
kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
ASReadStreamCallBack,
&context);
CFReadStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
}
}
static void ASReadStreamCallBack (CFReadStreamRef aStream, CFStreamEventType eventType,void* inClientInfo)
{
AudioStreamer* streamer = (AudioStreamer *)inClientInfo;
[streamer handleReadFromStream:aStream eventType:eventType];
}
AudioFileStreamOpen(self,ASPropertyListenerProc,ASPacketsProc,fileTypeHint,&audioFileStream);
- (void)createQueue {
sampleRate = asbd.mSampleRate;
packetDuration = asbd.mFramesPerPacket / sampleRate;
// create the audio queue
AudioQueueNewOutput(&asbd, ASAudioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue);
// listen to the "isRunning" property
AudioQueueAddPropertyListener(audioQueue, kAudioQueueProperty_IsRunning, ASAudioQueueIsRunningCallback, self);
// get the packet size if it is available
UInt32 sizeOfUInt32 = sizeof(UInt32);
AudioFileStreamGetProperty(audioFileStream, kAudioFileStreamProperty_PacketSizeUpperBound, &sizeOfUInt32, &packetBufferSize);
for (unsigned int i = 0; i < kNumAQBufs; ++i)
{
AudioQueueAllocateBuffer(audioQueue, packetBufferSize, &audioQueueBuffer[i]);
}
}
AudioQueueEnqueueBuffer(audioQueue, fillBuf, packetsFilled, packetDescs);
AudioQueueStart(audioQueue, NULL);
答案 0 :(得分:0)
我想,你使用了MPMusicPlayerController
类。如果您需要一些代码,您还必须提供一些数据或代码。我不知道,你正在使用什么课......
但是,如果你使用了这个,那么你可以在滑块改变时设置currentPlaybackTime属性。
比方说,你有这个例子:
@property (nonatomic, strong) MPMusicPlayerController *musicPlayer;
然后,你可以改变这样的游戏时间:
- (IBAction)sliderChanged:(id)sender
{
self.musicPlayer.currentPlaybackTime = self.slider.value;
}