ios音频:使用audioqueue改变播放进度
Posted
技术标签:
【中文标题】ios音频:使用audioqueue改变播放进度【英文标题】:ios audio: using audioqueue to change the playing progress 【发布时间】:2013-09-03 06:42:54 【问题描述】: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);
【问题讨论】:
【参考方案1】:我想,你使用了MPMusicPlayerController
类。如果你需要一些代码,你也必须提供一些数据或代码。不知道你用的是什么类...
不过,如果你使用了这个,那么你可以在滑块改变时设置 currentPlaybackTime 属性。
假设你有这个实例:
@property (nonatomic, strong) MPMusicPlayerController *musicPlayer;
然后,您可能可以像这样更改播放时间:
- (IBAction)sliderChanged:(id)sender
self.musicPlayer.currentPlaybackTime = self.slider.value;
【讨论】:
感谢您的回答。但由于功能限制,我不会使用任何系统自带的控制器。目前,我只想使用“AudioQueue”类来播放本地音频文件。我放了一些代码。代码没有完成,也许你可以阅读调用的函数。以上是关于ios音频:使用audioqueue改变播放进度的主要内容,如果未能解决你的问题,请参考以下文章