2015-11-29 1 views

ответ

0

AVAudioPlayer имеет метод playAtTime: который ухаживает t1, однако не существует простой способ, чтобы остановить воспроизведение в определенный момент времени (t2 ).

По iOS8AVFoundation имеет новый API, такие как AVAudioEngine и AVAudioPlayerNode. Вы можете найти реализацию AVAudioPlayerNode вместо более подходит для ваших требований, как это имеет метод, названный

- scheduleSegment:startingFrame:frameCount:atTime:completionHandler: 

, который для воспроизведения сегмента аудиофайла.

+1

спасибо за советы. Я попробую ** AVAudioEngine **, поскольку целью развертывания моего приложения является ** IOS8 **. – icould

+0

добро пожаловать. До ios8 я использовал бы Audio Toolbox framework с AudioQueueServices api для такого рода вещей, но когда AVAudioEngine был представлен, я использую его сейчас. В основном это оболочка obj-c для некоторых более низких уровней C apis в Core Audio, таких как AudioUnits. – Bamsworld

+1

спасибо. См. Рабочий код. – icould

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]; 

}