标签: avplayeritem

AVPlayer已取消分配,而键值观察者仍在其中注册

我正在创建一个简单的媒体播放器应用.我的应用程序在播放第一个链接时崩溃,我点击了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)

objective-c ios avplayer avplayeritem

34
推荐指数
1
解决办法
3万
查看次数

AVPlayer太长,延迟到readyToPlay并在swift中播放服务器音乐

我试图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)

ios avplayer swift avplayeritem

20
推荐指数
2
解决办法
7013
查看次数

AVPlayer使用资源加载器委托停止在大型视频文件上

我正在使用这种方法来保存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)

ios avplayer avplayeritem

15
推荐指数
1
解决办法
5987
查看次数

使用AVQueuePlayer跳转到之前的更好方法?

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)

ios avqueueplayer swift avplayeritem

14
推荐指数
1
解决办法
4934
查看次数

无需重新下载即可重播AVPlayerItem/AVPlayer

我有一个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)

audio objective-c ios avplayer avplayeritem

11
推荐指数
2
解决办法
4665
查看次数

在swift中为AVPlayer添加自定义控件

我正在尝试创建一个表格视图,以便我可以播放视频.我能够使用AVPlayer和图层完成此操作.

我想在视频视图的底部添加一个带滑块的自定义播放和暂停按钮.

AVPlayerController内置了这些控件.

我如何在AVPlayer中实现这些.我一直在寻找例子.但我还没有发现任何.

我可以遵循任何GitHub示例或代码示例吗?任何帮助将非常感激.

ios avplayer swift avplayeritem swift3

11
推荐指数
1
解决办法
1万
查看次数

AVPlayer因AVPlayerItemStatusFailed失败(OSStatus错误-12983)

有时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)

avfoundation ios avplayer avplayerlayer avplayeritem

10
推荐指数
1
解决办法
8206
查看次数

停止AVPlayer并再次重启mp3文件

我想开始,暂停和停止(与重启相同)我的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)

但是然后播放器当然是零,我无法重新启动文件,无法进行新的初始化....任何想法如何停止它?

objective-c ios avplayer avplayeritem

10
推荐指数
2
解决办法
8857
查看次数

检查AVFoundation何时可以获得资源

我正在使用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针对此错误的文档:

似乎苹果AVPlayer对整个系统可以创造的数量有限制; …

avfoundation ios avplayer swift avplayeritem

10
推荐指数
1
解决办法
959
查看次数

通过AVAssetExportSession将资产导出到文件系统总是失败 - Swift 3

我想将存储在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)

avassetexportsession avasset swift avplayeritem swift3

9
推荐指数
0
解决办法
1043
查看次数