我正在创建一个简单的媒体播放器应用.我的应用程序在播放第一个链接时崩溃,我点击了uitableview中的第二个链接.
- (void)viewDidLoad {
[super viewDidLoad];
arrURL = [NSArray arrayWithObjects: @"http://yp.shoutcast.com/sbin/tunein-station.pls?id=148820", @"http://www.kcrw.com/pls/kcrwmusic.pls",@"http://yp.shoutcast.com/sbin/tunein-station.pls?id=175821",@"http://yp.shoutcast.com/sbin/tunein-station.pls?id=148820",@"http://yp.shoutcast.com/sbin/tunein-station.pls?id=70931",nil];
url = [[NSURL alloc] init];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [arrURL count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] ;
}
cell.textLabel.text = [arrURL objectAtIndex:indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
selectedSongIndex = indexPath.row;
url = [[NSURL alloc] initWithString:[arrURL objectAtIndex:indexPath.row]];
[self …Run Code Online (Sandbox Code Playgroud) 我试图remote url用快速语言缓冲并立即播放音频.
但问题是需要很长时间才能完成 readyToPlay案例和游戏.
例如,声音网址需要大约12到15秒才能运行.
这是我的代码:
var asset: AVAsset!
var player: AVPlayer!
var playerItem: AVPlayerItem!
private var playerItemContext = 0
let requiredAssetKeys = [ "playable","hasProtectedContent"]
Run Code Online (Sandbox Code Playgroud)
let url = URL(string: "http://sound_link.mp3")!
asset = AVAsset(url: url)
playerItem = AVPlayerItem(asset: asset,
automaticallyLoadedAssetKeys: requiredAssetKeys)
playerItem.addObserver(self,
forKeyPath: #keyPath(AVPlayerItem.status),
options: [.old, .new],
context: &playerItemContext)
player = AVPlayer(playerItem: playerItem)
Run Code Online (Sandbox Code Playgroud)
根据这个(ExploringAVFoundation)文档已经完成了
并且对于玩家准备玩家玩的手柄我使用observeValue func:
override func observeValue(forKeyPath keyPath: String?,of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard context == &playerItemContext else …Run Code Online (Sandbox Code Playgroud) 我正在使用这种方法来保存AVPlayer的缓冲区数据以用于视频文件.找到这个问题的答案保存AVPlayer的缓冲区数据.
iPhone和iPad - iOS 8.1.3
我做了必要的更改来播放视频,它工作得非常好,除非我尝试播放一段很长的视频(长11-12分钟,大小约为85mb),视频将在连接完成加载后大约4分钟停止.我收到了playbackBufferEmpty事件和播放器项目停止通知.
这是代码的要点
viewController.m
@property (nonatomic, strong) NSMutableData *videoData;
@property (nonatomic, strong) NSURLConnection *connection;
@property (nonatomic, strong) AVURLAsset *vidAsset;
@property (nonatomic, strong) AVPlayerItem *playerItem;
@property (nonatomic, strong) AVPlayerLayer *avlayer;
@property (nonatomic, strong) NSHTTPURLResponse *response;
@property (nonatomic, strong) NSMutableArray *pendingRequests;
/**
Startup a Video
*/
- (void)startVideo
{
self.vidAsset = [AVURLAsset URLAssetWithURL:[self videoURLWithCustomScheme:@"streaming"] options:nil];
[self.vidAsset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];
self.pendingRequests = [NSMutableArray array];
// Init Player Item
self.playerItem = [AVPlayerItem playerItemWithAsset:self.vidAsset];
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew …Run Code Online (Sandbox Code Playgroud) 我AVQueuePlayer在我的应用程序中使用了一个.我有两个滑动手势跳到下一个跳过以前的avplayeritems.现在要跳到下一个我只是在avqueueplayer上调用advanceToNextItem,效果很好.
然而,跳到上一个我正在删除所有项目并将它们添加回前面的前一个视频,这在跳过前几次时非常慢.我怎样才能像打电话一样加快速度advanceToNextItem?
我的代码看起来像这样:
func skipToPrevious() {
queuePlayer.removeAllItems()
// move the previous playerItem to the front of the list then add them all back in
for playerItem in playerItems:
queuePlayer.insertItem(playerItem, afterItem: nil)
}
Run Code Online (Sandbox Code Playgroud) 我有一个AVPlayer类,所有设置都流式传输音频文件.它有点长,所以我不能在这里发布整个事情.我所坚持的是如何允许用户在完成一次听完之后重放音频文件.当它第一次完成时,我正确收到通知AVPlayerItemDidPlayToEndTimeNotification.当我重播它时,我立即收到相同的通知,阻止我重播它.
我怎么能重置这个,以至于AVPlayerItem不认为它已经播放了音频文件?我可以释放所有内容并重新设置它,但我相信这将迫使用户再次下载音频文件,这是毫无意义和缓慢的.
以下是我认为相关的课程的一些部分.尝试重播文件时得到的输出如下所示.前两行正是我所期望的,但第三行是一个惊喜.
正在播放
没有定时器的
音频播放器已播放音频
- (id) initWithURL : (NSString *) urlString
{
self = [super init];
if (self) {
self.isPlaying = NO;
self.verbose = YES;
if (self.verbose) NSLog(@"url: %@", urlString);
NSURL *url = [NSURL URLWithString:urlString];
self.playerItem = [AVPlayerItem playerItemWithURL:url];
self.player = [[AVPlayer alloc] initWithPlayerItem:self.playerItem];
[self determineAudioPlayTime : self.playerItem];
self.lengthOfAudioInSeconds = @0.0f;
[self.player addObserver:self forKeyPath:@"status" options:0 context:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];
}
return self;
}
// this is what gets called when the …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个表格视图,以便我可以播放视频.我能够使用AVPlayer和图层完成此操作.
我想在视频视图的底部添加一个带滑块的自定义播放和暂停按钮.
AVPlayerController内置了这些控件.
我如何在AVPlayer中实现这些.我一直在寻找例子.但我还没有发现任何.
我可以遵循任何GitHub示例或代码示例吗?任何帮助将非常感激.
有时AVPlayer失败,AVPlayerItemStatusFailed并且在失败发生后,AVPlayer继续失败AVPlayerItemStatusFailed.我试图清除AVPlayer实例并创建新实例,但我无法实现AVPlayerItemStatusFailed无法解决.也removingFromSuperview UIView有AVPlayer实例和初始化新项目与AVPlayer不会解决问题.
所以我认为AVPlayer无法完全清除.是否有人建议完全清除AVPlayer并使其在失败后工作?
错误日志:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x1a689360 {NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x1a688e70 "The operation couldn’t be completed. (OSStatus error -12983.)", NSLocalizedFailureReason=An unknown error occurred (-12983)}
Run Code Online (Sandbox Code Playgroud)
UPD. 对于@matt
playerItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:filePath.path]];
if (!self.avPlayer) {
avPlayer = [AVPlayer playerWithPlayerItem:playerItem];
}
[avPlayer.currentItem addObserver:self forKeyPath:@"status" options:0 context:nil];
if (self.avPlayer.currentItem != self.playerItem) {
[self.avPlayer replaceCurrentItemWithPlayerItem:playerItem];
}
AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
avPlayerLayer.frame = self.bounds;
[self.layer addSublayer:avPlayerLayer]; …Run Code Online (Sandbox Code Playgroud) 我想开始,暂停和停止(与重启相同)我的mp3文件,我正在使用AVPlayer.我从服务器获取文件.
要启动歌曲我做:
[self.player start];
Run Code Online (Sandbox Code Playgroud)
暂停我做:
[self.player pause];
Run Code Online (Sandbox Code Playgroud)
但是当我想要停止歌曲并重新加载时,以便当用户下次点击"开始按钮"时歌曲从头开始,我不知道该怎么办...
我试过这样的事情:
[self.player pause];
self.player = nil;
Run Code Online (Sandbox Code Playgroud)
但是然后播放器当然是零,我无法重新启动文件,无法进行新的初始化....任何想法如何停止它?
我正在使用AVFoundation和创建AVPlayer但是会出现一些错误,如下所示.
这些是2个错误:
2017-01-06 15:51:19.974693 DemoApp [11855:3855225]视频播放器状态失败:播放器项错误=错误域= AVFoundationErrorDomain代码= -11839"无法解码"UserInfo = {NSUnderlyingError = 0x174253ef0 {错误域= NSOSStatusErrorDomain代码= -12913"(null)"},NSLocalizedFailureReason =此媒体所需的解码器正忙.,NSLocalizedRecoverySuggestion =停止解码媒体的任何其他操作,然后重试.,NSLocalizedDescription =无法解码}
2017-01-06 15:51:19.974783 DemoApp [11855:3855225]视频播放器状态失败:播放器错误=(null)
我可以像这样打印这两个错误:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
///.. other code ..///
case AVPlayerItemStatusFailed: {
print("Video player Status Failed: player item error = \(self.player.currentItem.error)")
print("Video player Status Failed: player error = \(self.player.error)")
}
}
Run Code Online (Sandbox Code Playgroud)
Apple针对此错误的文档:
case decoderTemporarilyUnavailable = -11839似乎苹果AVPlayer对整个系统可以创造的数量有限制; …
我想将存储在AVPlayerItem中的.mp4-video导出到文件系统.如果成功,我想把它变成一个NSData变量(但这不是问题的一部分,只是想告诉你为什么我想把它存储到文件系统中).
//This is the AVPlayerItem-Object
let item = self.talentView.getCurrentItem()
//They return all true, so the item itself is not the issue
print(item.asset.isPlayable)
print(item.asset.isReadable)
print(item.asset.isExportable)
//Creating Path, where the file will be stored, also tried "video.mp4" at the appending string
var exportPath: NSString = NSTemporaryDirectory().appendingFormat("/video.mp4")
var exportUrl: NSURL = NSURL.fileURL(withPath: exportPath as String) as NSURL
let session = AVAssetExportSession(asset: item.asset, presetName: AVAssetExportPresetPassthrough)
session?.outputFileType = AVFileTypeMPEG4
session?.outputURL = exportUrl as URL
session?.exportAsynchronously(completionHandler: {
//case is always .failed
switch session!.status {
case .failed: …Run Code Online (Sandbox Code Playgroud) avplayeritem ×10
ios ×9
avplayer ×8
swift ×5
objective-c ×3
avfoundation ×2
swift3 ×2
audio ×1
avasset ×1