2016-01-26 5 views
7

私は、ユーザーがビデオを繰り返し再生できるように、ビューを更新せずにAVPlayerのURLをオンザフライで変更しようとしています。しかし、今は、ビデオを再生するたびにAVPlayerオブジェクトをインスタンス化するだけです(オーディオを互いに再生することになります)。これは、これを行う最善の方法ではないと感じています。 imageViewでイメージを変更するのと同じように効率的な方法がありますか?新しいAVPlayerオブジェクトを作成せずに新しいURLからビデオを再生

これは私がクリップを再生するコードです:

player = AVPlayer(URL: fileURL) 
playerLayer = AVPlayerLayer(player: player) 
playerLayer!.frame = self.view.bounds 
self.view.layer.addSublayer(playerLayer!) 
player!.play() 

答えて

0

私はこれを行うことによって、あなたが探しているものを達成することができるよ...

私は、曲の名前ののtableViewを持っていますmp3ファイルはParse.comに保存されています。 didSelectRowAtIndexPathでは、私はこれを実行すると、私は...

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    SelectedSongNumber = indexPath.row 
    grabSong() 
} 


    func grabSong() { 

    let songQuery = PFQuery(className: "Songs") 
    songQuery.getObjectInBackgroundWithId(iDArray[SelectedSongNumber], block: { 
     (object: PFObject?, error : NSError?) -> Void in 


     if let audioFile = object?["SongFile"] as? PFFile { 
      let audioFileUrlString: String = audioFile.url! 
      let audioFileUrl = NSURL(string: audioFileUrlString)! 

      myAVPlayer = AVPlayer(URL: audioFileUrl) 
      myAVPlayer.play() 

      currentUser?.setObject(audioFileUrlString, forKey: "CurrentSongURL") 
      currentUser?.saveInBackground() 
     } 
    }) 
} 

は、私は、行を選択しないと曲が再生を開始します。数秒待って別の行を選択すると、AVPlayerは選択した新しいセルの曲を再生し、もう一方の曲は再生しません。私のAVPlayerは、すべてのクラスの公開変数として宣言されています。

+0

私が言ったように、作成した後はAVPlayerオブジェクトにアクセスしないでください。むしろ、そのcurrentItemだけで動作します。 –

+0

@JamesBush実際、あなたの方が良い方法です。別のオプションは、AVQueuePlayerを使用して、可能なすべてのURLにAVPlayerItems配列を追加し、その配列をキューに挿入し、その配列を即座に並べ替えることです。これにより、前のビデオがまだ再生されている間、次のビデオのバッファリングが開始されます。 – MikeG

+0

または [self.player prerollAtRate:1.0 completionHandler:^(BOOL finished){ [self.player play]; [self.player setRate:1。0]; }]; –

3

AVPlayerItemを使用して、AVPlayerオブジェクトへの出力の追加と削除を行います。

AVPlayerを作成するときにAVPlayerにビデオを追加する代わりに、空のAVPlayerインスタンスを作成してから、AVPlayerItemクラスのaddOutputメソッドを使用してビデオを追加します。

ビデオを削除して追加するには、AVPlayerItemクラスのremoveOutputメソッドを使用して古いビデオを削除し、次にaddOutputメソッドを再度使用して新しいビデオを挿入します。

サンプルコードは、次のAppleの開発者サイトから入手できます。

https://developer.apple.com/library/prerelease/content/samplecode/AVBasicVideoOutput/Introduction/Intro.html

それは私がするのと同じものを提供し、私は自分のコードを投稿していました。

+0

ありがとう、私もAVAssetを使用する必要がありますか? – cb428

+0

URLまたはAVAssetなしでAVPlayerItemをインスタンス化できないため、私は尋ねます。私はAVPlayerを設定するviewDidLoadのfileURL変数にアクセスすることはできません。 – cb428

+0

@James Bushさんはコードを表示できますか? – George

12

AVPlayerを使用しないでください。

代わりにAVQueuePlayerを使用すると、キューに項目を挿入したり削除したりすることができます。あなたは、単に

//optional: clear current queue if playing straight away 
self.localPlayer.removeAllItems() 

//get url of track 
let url : URL? = URL.init(string: "http://urlOfItem") 
if url != nil { 
    let playerItem = AVPlayerItem.init(url: url!) 

    //you can use the after property to insert 
    //it at a specific location or leave it nil 
    self.localPlayer.insert(playerItem, after: nil) 
    self.localPlayer.play() 
} 

AVQueuePlayerを使用することができるアイテムを追加する

//create local player in setup methods 
self.localPlayer = AVQueuePlayer.init() 

AVPlayerのすべての機能をサポートしていますが、キューからのアイテムの追加と削除の追加機能を持っています。

+0

であっても、コードを表示する必要があります。どうもありがとう。 –

関連する問題