Интересно, есть ли более элегантный способ воспроизведения mp3-файла с помощью класса AVAudioPlayer, от t1 до t2 без использования NSTimers?Как играть в mp3-файл в Xcode с момента времени t1 до t2 с помощью AVAudioPlayer
-2
A
ответ
0
AVAudioPlayer имеет метод playAtTime:
который ухаживает t1, однако не существует простой способ, чтобы остановить воспроизведение в определенный момент времени (t2 ).
По iOS8AVFoundation имеет новый API, такие как AVAudioEngine и AVAudioPlayerNode. Вы можете найти реализацию AVAudioPlayerNode вместо более подходит для ваших требований, как это имеет метод, названный
- scheduleSegment:startingFrame:frameCount:atTime:completionHandler:
, который для воспроизведения сегмента аудиофайла.
1
Я тестировал ниже код и отлично работает в течение t1 и t2. Но не забудьте указать AVAudioEngine *engine
в своем классе.
- (void) playAudioWithinT1: (float) t1 andT2:(float) t2{
//t1 and t2 are the seconds to play audio in between
NSError *error;
NSURL *urlForSoundFile;
float startingFrame;
float framesToPlay;
NSString *audioPath = [[NSBundle mainBundle] pathForResource:@"_preview" ofType:@"mp3"];
urlForSoundFile = [NSURL fileURLWithPath:audioPath];
engine = [[AVAudioEngine alloc] init];
AVAudioPlayerNode *player = [[AVAudioPlayerNode alloc] init];
[engine attachNode:player];
AVAudioFile *file = [[AVAudioFile alloc] initForReading:urlForSoundFile
error:&error];
startingFrame = (t1 * file.processingFormat.sampleRate);
framesToPlay = (t2 * file.processingFormat.sampleRate - startingFrame);
AVAudioMixerNode *mainMixer = [engine mainMixerNode];
[engine connect:player to:mainMixer format:file.processingFormat];
[player scheduleSegment:file startingFrame:startingFrame frameCount:framesToPlay atTime:nil completionHandler:nil];
[engine startAndReturnError:&error];
[player play];
}
спасибо за советы. Я попробую ** AVAudioEngine **, поскольку целью развертывания моего приложения является ** IOS8 **. – icould
добро пожаловать. До ios8 я использовал бы Audio Toolbox framework с AudioQueueServices api для такого рода вещей, но когда AVAudioEngine был представлен, я использую его сейчас. В основном это оболочка obj-c для некоторых более низких уровней C apis в Core Audio, таких как AudioUnits. – Bamsworld
спасибо. См. Рабочий код. – icould