在不创建新的AVPlayer对象的情况下播放来自新网址的视频

时间:2016-01-26 00:22:21

标签: ios swift

我正在尝试允许用户循环播放视频,即时更改AVPlayer URL而不刷新视图。但是,现在我只是在每次播放视频时实例化AVPlayer对象(导致音频互相播放),我觉得这不是最好的方法。是否有一种更有效的方法类似于在imageView中更改图像?

这是我播放剪辑的代码:

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

4 个答案:

答案 0 :(得分:19)

请勿使用AVPlayer

而是使用允许您从队列中插入和删除项目的AVQueuePlayer

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

添加您可以使用的项目

//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支持AVPlayer的所有功能,但具有在队列中添加和删除项目的附加功能。

答案 1 :(得分:3)

使用AVPlayerItem向AVPlayer对象添加和删除输出。

创建一个空的AVPlayer实例,然后使用AVPlayerItem类的addOutput方法添加视频,而不是在创建AVPlayer时向AVPlayer添加视频。

要删除视频并添加新视频,请使用AVPlayerItem类的removeOutput方法删除旧视频,然后再次使用addOutput方法插入新视频。

示例代码可从Apple的开发者网站获取;

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

它提供的内容与我一样,是我发布自己的代码。

答案 2 :(得分:0)

通过这样做,我能够完成你想要的......

我有一个歌曲名称的tableView,mp3文件存储在Parse.com上。在#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <string> #pragma comment(lib, "Ws2_32.lib") using namespace std; int main(){ cout << ">>>WINSOCK CLIENT\n"; WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; addrinfo *Results = NULL; if (!getaddrinfo("41.143.215.79", "255", &hints, &Results)){ cout << "->Ready To Create SOCKET and connect to SERVER\n"; SOCKET connectSocket = INVALID_SOCKET; connectSocket = socket(Results->ai_family, Results->ai_socktype, Results->ai_protocol); if (connectSocket != INVALID_SOCKET){ cout << "->Created Socket Successfuly...connecting to server\n"; if (connect(connectSocket, Results->ai_addr, Results->ai_addrlen) != SOCKET_ERROR){ cout << "->Connected To Server Successfuly\n"; string Message; while (true){ cout << "\n->Enter A Message :"; getline(cin, Message); if (send(connectSocket, Message.c_str(), sizeof(Message), 0) != SOCKET_ERROR){ cout << "MESSAGE IS SENT\n"; } } } } } cin.get(); return 0; } 我做...

didSelectRowAtIndexPath

当我运行时,我选择一行并开始播放歌曲。如果我等待几秒钟并选择另一行,AVPlayer将从我选择的新单元格播放歌曲,而不会播放另一首歌曲。我的AVPlayer被声明为所有类的公共变量。

答案 3 :(得分:0)

全局创建AVPlayer实例,然后在您想从新URL播放新视频时再次覆盖它。