2016-01-05 39 views
0

在这里,我正在重新加载mpeg文件,每次播放一段。如何有效地解析mpeg文件?

我宁愿逐步通过一个加载的文件,但我似乎无法建立一个定位一致的文件指针......以下方法是我能做的最好的。

我错过了什么有效地只通过一个文件? THX

float offset[26] = { 2.1, 3.1, 4.0, 5.0, 5.5, 
         6.5, 7.8, 8.8, 10.0, 10.7, 
        11.5, 12.5, 13.5, 14.5, 15.3, 
        16.1, 17.2, 17.9, 18.9, 19.7, 
        20.5, 21.5, 22.5, 23.5, 24.5, 25.3 }; //fileOffset for voice segments 


for (int i = 25; i > -1 ; i--) { 
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; 
    player.numberOfLoops = 0; 

    [player playAtTime: player.deviceCurrentTime - offset[i]]; 

    sleep(1);//one second duration 
    [player stop]; 
} 

回答

1

你可以利用- audioPlayerDidFinishPlaying:successfully:AVAudioPlayerDelegate方法,找出当片段播放完毕,然后再寻求下一个位置,避免了需要重建的变量,每次重新加载音频文件。

@property (nonatomic) float indexOfLastOffset; 
@property (nonatomic) float offsets[16]; 

- (void)viewDidLoad:(BOOL)animated { 
    self.indexOfLastOffset = 25; 
    self.offsets = { 2.1, 3.1, 4.0, 5.0, 5.5, 
        6.5, 7.8, 8.8, 10.0, 10.7, 
       11.5, 12.5, 13.5, 14.5, 15.3, 
       16.1, 17.2, 17.9, 18.9, 19.7, 
       20.5, 21.5, 22.5, 23.5, 24.5, 25.3 }; 

    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; 
    player.numberOfLoops = 0; 
    player.delegate = self; 
    [self player:player playWithOffsetIndex:self.indexOfLastOffset]; 

    [super viewDidLoad]; 
} 

- (void)player:(AVAudioPlayer *)player playWithOffsetIndex:(NSUInteger)offsetIdx { 
    [player playAtTime:player.deviceCurrentTime - offsets[offsetIdx]]; 
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player 
         successfully:(BOOL)flag { 
    if (flag && indexOfLastOffset >= 0) { 
     [self player:player playWithOffsetIdx:self.indexOfLastOffset - 1]; 
     self.indexOfLastOffset -= 1; 
    } 
    else { 
     [player stop]; 
    } 
}