2016-09-11 3 views
1

シンプルなオーディオファイルが.wav形式です(オーディオファイルは完全にループしてカットされています)。私はそれをループするためにさまざまな方法を試しました。私の最初の試みは、単にAVPlayerとNSNotificationを使って、audioItemがゼロになってから時間を探して再び再生することを検出することでした。しかし、明らかにギャップがありました。AVQueuePlayerを使用してシームレスなオーディオループを作成しようとしていますが、なぜループ間に小さなサイレントポーズがあるのか​​わかりません。

私は、オンラインでさまざまなソリューションを見て、スイッチングを行うためにAVQueuePlayerを使っている人を見つけてきました: Looping AVPlayer seamlessly

実装する場合しかし、これはまだギャップを生成します。

weak var weakSelf = self 
NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: nil, queue: nil, usingBlock: {(note: NSNotification) -> Void in 

     if weakSelf?.currentQueuePlayer.currentItem == weakSelf?.currentAudioItemOne { 

      weakSelf?.currentQueuePlayer.insertItem((weakSelf?.currentAudioItemTwo)!, afterItem: nil) 
      weakSelf?.currentAudioItemTwo.seekToTime(kCMTimeZero) 
     } else { 
      weakSelf?.currentQueuePlayer.insertItem((weakSelf?.currentAudioItemOne)!, afterItem: nil) 
      weakSelf?.currentAudioItemOne.seekToTime(kCMTimeZero) 
     } 

    }) 

ここでは、現在のQueuePlayerを設定するには、私のコードだ:

は、ここに私の現在の通知コードです。

let audioPlayerItem = AVPlayerItem(URL: url) 
currentAudioItemOne = audioPlayerItem 


currentAudioItemTwo = audioPlayerItem 

currentQueuePlayer = AVQueuePlayer() 
currentQueuePlayer.insertItem(currentAudioItemOne, afterItem: nil) 

currentQueuePlayer.play() 

私はこの問題を数日間は解決しています。すべてのリードや新しいことを試していただければ幸いです。私がこれまで試みていないのは、低品質のオーディオファイルだけです。これらの.wavファイルはすべて1MB以上で、ファイルサイズがシームレスループに影響する可能性があると思われていました。

EDIT: 'トレッドミル' 効果を作成するためにAVPlayerLooperを使用し

 let url = URL(fileURLWithPath: path) 
     let audioPlayerItem = AVPlayerItem(url: url) 
     currentAudioItemOne = audioPlayerItem 

     currentQueuePlayer = AVQueuePlayer() 
     currentAudioPlayerLayer = AVPlayerLayer(player: currentQueuePlayer) 
     currentAudioLooper = AVPlayerLooper(player: currentQueuePlayer, templateItem: currentAudioItemOne) 

     currentQueuePlayer.play() 

はEDIT 2:私のwavファイルの1にafinfo

Num Tracks:  1 
---- 
Data format:  2 ch, 44100 Hz, 'lpcm' (0x0000000C) 16-bit little-endian signed integer 
       no channel layout. 
estimated duration: 11.302336 sec 
audio bytes: 1993732 
audio packets: 498433 
bit rate: 1411200 bits per second 
packet size upper bound: 4 
maximum packet size: 4 
audio data file offset: 44 
not optimized 
source bit depth: I16 
---- 

答えて

3

ますアイテムを現在のソリューションに挿入するのが遅すぎます。複数の初期項目を並べ替える必要があるため、常に準備が整ったAVPlayerItemが用意されています。

これは、better described in this WWDC 2016 sessionとしてAVPlayerQueue「トレッドミルパターン」と呼ばれます。 iOS 10をターゲットにしている場合は、新しいAVPlayerLooperクラスを使用できます(同じリンクにも記載されています)。 Appleはまた、両方の戦略の例を提供するsample projectを提供しています。

低レベルのソリューションは、AVAudioEngineインスタンスにオーディオバッファをキューに入れたりAudioQueueを使用して、またはAudioUnitと一緒に自分でバッファをマッシュ含まれています。

+0

ありがとうございました。私はXcode 8にアップデートしてAVPlayerLooperを実装することができましたが、まだ明らかなギャップがあります。これはとても奇妙です。音楽ファイルは完全にカットされています。私は何が間違っているのか分からない。私は間違いなくAVPlayerLooperを正しく実装しています。コードを編集に貼り付けることができます。 –

+0

音楽はどのような形式ですか? –

+0

圧縮されていない.wavです。私がそのものを手に入れた健全な男は、完璧なループだと確信しています。それを聞いてから、私は彼を信じています。 私は何かを逃しているように感じる。 AVPlayerLooperはうまくいくはずです...私はとてもショックです。私はAVPlayerQueueを使って古典的なトレッドミルの実装を試してみるべきですか?または、私はAVPlayerLooperを間違って使用しているかもしれません。知りません。いずれの方向もすばらしいでしょう。レスポンスマンに感謝します。これは感情的に残忍でした... –

関連する問題