繁体   English   中英

ios音频:使用音频队列更改播放进度

[英]ios audio: using audioqueue to change the playing progress

iOS问题:使用音频队列更改播放值

最近,我制作了一个带有音频队列的音乐播放器(不使用avplayer),该播放器播放本地音频文件,但不播放Internet文件。现在,我想实现一个用户可以使用滑块更改播放进度的功能,该怎么办? 简而言之,当播放本地文件时,如何使用音频队列来实现幻灯片播放进度。

祝您回答一些重要的代码!

- - - - - - - - - - - - - -附加 - - - - - - - - - - - --
我在音频流媒体演示中修改了代码(URL: http : //code4app.net/ios/Audio-Streamer/5019d9066803faa344000000 ),我的想法大致如下:
1,用本地音乐文件打开流。
2,创建一个AudioFileStreamID对象(audioFileStream)。
3,在回调ASPacketsProc中创建队列。
4,创建队列后,将队列的缓冲区填充到回调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);

我想,您使用了MPMusicPlayerController类。 如果需要一些代码,则还必须提供一些数据或代码。 我不知道你在用什么课...

但是,如果使用了此功能,则可以在滑块更改时设置currentPlaybackTime属性。

假设您有以下实例:

@property (nonatomic, strong) MPMusicPlayerController *musicPlayer;

然后,可能可以这样更改播放时间:

- (IBAction)sliderChanged:(id)sender
{
    self.musicPlayer.currentPlaybackTime = self.slider.value;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM