我正在尝试允许用户循环播放视频,即时更改AVPlayer URL而不刷新视图。但是,现在我只是在每次播放视频时实例化AVPlayer对象(导致音频互相播放),我觉得这不是最好的方法。是否有一种更有效的方法类似于在imageView中更改图像?
这是我播放剪辑的代码:
player = AVPlayer(URL: fileURL)
playerLayer = AVPlayerLayer(player: player)
playerLayer!.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer!)
player!.play()
答案 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的开发者网站获取;
它提供的内容与我一样,是我发布自己的代码。
答案 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播放新视频时再次覆盖它。