1

特定の時間に開始する一連のオーディオ トラックで構成される AVMutableComposition を作成しました。そこから、Apple の推奨に従って、AVPlayer で再生する前に AVComposition に変換しました。

この AVPlayer アイテムの再生はすべて正常に機能しますが、一時停止してから続行すると、コンポジション内のすべてのトラックが互いに約 0.2 秒遅れて表示されます (つまり、束になります)。一時停止を押して数回続けると、効果が倍増し、オーバーラップがより重要になります (基本的に、十分にヒットすると、8 つのトラックすべてが同時に再生されます)。

if (self.player.rate > 0.0) {
    //if player is playing, pause
    [self.player pause];

} else {

    if (self.player) {
      [self.player play];
       return;

        }

     */CODE CREATING COMPOSITION - missed out big chunk of code relating to finding the track and retrieving its position and scale/*


        NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
                                                            forKey:AVURLAssetPreferPreciseDurationAndTimingKey];

        AVURLAsset *sourceAsset = [[AVURLAsset alloc] initWithURL:url options:options];

        //calculate times
        NSNumber *time = [soundArray1 objectAtIndex:1]; //this is the time scale - e.g. 96 or 120 etc.

        double timenow = [time doubleValue];

        double insertTime = (240*y);

                    AVMutableCompositionTrack *track =
        [composition addMutableTrackWithMediaType:AVMediaTypeAudio
                                 preferredTrackID:kCMPersistentTrackID_Invalid];

        //insert the audio track from the asset into the track added to the mutable composition
        AVAssetTrack *myTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
        CMTimeRange myTrackRange = myTrack.timeRange;
        NSError *error = nil;
        [track insertTimeRange:myTrackRange
                                      ofTrack:myTrack
                                       atTime:CMTimeMake(insertTime, timenow) 
                                        error:&error];

        [sourceAsset release];







    }

} 
    AVComposition *immutableSnapshotOfMyComposition = [composition copy];

        AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:immutableSnapshotOfMyComposition];
        self.player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
        NSLog(@"here");

        [self.player play];

ありがとう

4

2 に答える 2

0

OK、これは少しハックな感じがしますが、誰かが立ち往生している場合でも間違いなく機能します。誰かがより良い答えを持っている場合は、私に知らせてください!

基本的には、一時停止を押したときにトラックの player.currentTime を保存し、再生を押したときに一時停止した時点からトラックを作り直すだけです。認識できるほどの遅延はありませんが、この余分な処理を無駄にすることなく満足しています。

一時停止を押した後、プレーヤー アイテムを適切に解放してください。そうしないと、AVPlayers の巨大なスタックになってしまいます。

于 2012-11-14T14:25:50.153 に答える
0

少しハッキーではありませんが、それでもハッキーなソリューションがあります。

解決策は、プレーヤーをシークすると、一時停止によって生じるオーディオとビデオの間の遅延がなくなることに気付いたことです。

したがってplayer.currentTime、一時停止する直前と、player seekToTime再び再生する直前を保存してください。iOS 6 ではうまく動作しますが、他のバージョンではまだテストしていません。

于 2013-10-23T02:04:22.403 に答える