Иоса: с помощью звуковых сообщений, чтобы изменить значение, играяИОСА аудио: с использованием звуковых сообщений для изменения хода процесса, играя
Recentlly, я делаю музыкальный плеер с звуковыми сообщениями (не используя AVPlayer), игрок играет локальные аудио файлов, но не интернет-файлы. Теперь я хочу добиться функции, которая может изменить ход воспроизведения с помощью слайдера. Как я могу это сделать? Короче говоря, как я могу использовать звуковой сигнал для достижения слайд-воспроизведения при воспроизведении локального файла.
Пожелайте ответу с помощью важного кода!
--------------------------- Добавить ------------------ -----
Я изменяю коды в демонстрации аудиопотока (URL: http://code4app.net/ios/Audio-Streamer/5019d9066803faa344000000). Мое мышление выглядит грубо:
1, откройте поток локальным музыкальным файлом.
2, Создайте AudioFileStreamID Obj (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);
Благодарим Вас за answer.But я не буду использовать любой из-за предельных функций. В настоящее время я хочу использовать класс AudioQueue для воспроизведения локальных аудиофайлов. Я помещаю некоторые коды. Коды не завершены, возможно, вы можете прочитать вызванные функции. – yonkie