标签: avplayer

使用AVPlayer的多个视频

我正在开发一款适用于iPad的iOS应用程序,需要在屏幕的某些部分播放视频.我有几个视频文件需要按照编译时未给出的顺序互相播放.它看起来好像只是一个视频播放.从一个视频转到另一个视频是很好的,这是两个视频的最后一帧或第一帧显示的延迟,但是没有闪烁或没有内容的白色屏幕.视频不包含音频.考虑内存使用情况非常重要.视频具有非常高的分辨率,并且可以同时彼此相邻地播放几个不同的视频序列.

为了获得这个,我已经尝试了一些解决方案.它们列在下面:

1.带有AVComposition的AVPlayer,其中包含所有视频

在这个解决方案中,我有一个AVPlayer,只能在AVPlayerItem上使用AVComposition制作,AVComposition包含彼此相邻的所有视频.当我去特定的视频时,我会在下一个视频开始的构图中寻找时间.这个解决方案的问题是,当寻找时,播放器将快速显示它正在寻找的一些帧,这是不可接受的.似乎没有办法直接跳到合成中的特定时间.我尝试通过制作刚完成的视频中最后一帧的图像来解决这个问题,然后在搜索时显示在AVPLayer前面,最后在搜索完成后删除它.我使用AVAssetImageGenerator制作图像,但由于某种原因,图像的质量与视频不同,因此在视频上显示和隐藏图像时会有显着的变化.另一个问题是AVPlayer使用大量内存,因为单个AVPlayerItem包含所有视频.

2.具有多个AVPlayerItem的AVPlayer

此解决方案为每个视频使用AVPlayerItem,并在切换到新视频时替换AVPlayer的项目.这个问题是,当切换AVPlayer的项目时,它会在加载新项目时短时间显示白色屏幕.为了解决这个问题,可以使用在加载时将图像放在最后一帧的前面的解决方案,但仍然存在图像和视频的质量不同且值得注意的问题.

3.两个AVPlayers互相排斥,轮流播放AVPlayerItem

我尝试的下一个解决方案是让两个AVPlayer在彼此之上,轮流播放AVPlayerItems.因此,当玩家完成播放时,它将保留在视频的最后一帧.另一个AVPlayer将被带到前面(其项目设置为nil,因此它是透明的),并且下一个AVPlayerItem将被插入到该AVPlayer中.一旦加载它就会开始播放,两个视频之间顺畅交易的错觉将完好无损.此解决方案的问题是内存使用情况.在某些情况下,我需要同时在屏幕上播放两个视频,这将导致4个AVPlayers同时加载AVPlayerItem.这只是太多的记忆,因为视频可以分辨率非常高.


有没有人有一些关于整体问题和上面发布的尝试解决方案的想法,建议,评论或其他内容.

objective-c ios avplayer avcomposition avplayerlayer

38
推荐指数
2
解决办法
2万
查看次数

AVPlayerItem不能与iOS 8.4中的多个AVPlayer实例相关联

更新到iOS 8.4后,我得到了臭名昭着的例外,MPMoviePlayerController其中说:

AVPlayerItem不能与多个AVPlayer实例关联

我已经看到了几个解决方法,主要包括在重用之前重新初始化播放器.但是,对我来说,当我尝试播放新视频时,不会发生崩溃,而是当我通过旋转到纵向模式关闭播放器的全屏时.

这是我的代码:

@implementation MoviePlayerViewController

-(void)viewDidLoad
{
    [super viewDidLoad];

    self.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreenNotification:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullscreenNotification:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
}

- (void) moviePlayerWillEnterFullscreenNotification:(NSNotification*)notification
{
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (void) moviePlayerWillExitFullscreenNotification:(NSNotification*)notification
{
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (void)deviceOrientationDidChange
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    if (orientation == UIDeviceOrientationPortrait) {
        [self.moviePlayer setFullscreen:NO animated:YES];
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

对全屏的更改发生在UIViewController具有MoviePlayerViewController …

cocoa-touch mpmovieplayercontroller ios avplayer ios8.4

37
推荐指数
1
解决办法
2292
查看次数

AVPlayer流式传输进度

我成功地使用AVPlayer从服务器流式传输音频,我现在要做的是显示一个UISlider显示缓冲进度的自定义.

像这样的东西:

在此输入图像描述

随着AVPlayer似乎有不被一种方式来获得总下载大小或音频文件的当前下载量,仅当前播放时间和总播放时间.

这有什么变通方法吗?

iphone ios avplayer

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

AVPlayer,播放/暂停状态的通知?

我正在寻找一种方法来获得AVPlayer开始播放时的确切时刻.有"费率"属性,但目前我正在定期检查它NSTimer以获取更新.

我试过KVO,但显然它不符合KVO标准.

我知道,有事件,当玩家ENDED.但我在这里谈论暂停.

我也KVO订阅了AVPlayerItem's"状态",但是当HTTP资产完成缓存,没有播放/暂停时它会显示我.我也开始收集播放/暂停的所有调用,之后请求即时UI更新,但在AVPlayer真正开始播放之前需要更多的runloops .我只是想立刻更新我的按钮.

ios avplayer

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

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获取HLS的PCM数据

过去几年似乎几次都没问过这个问题,但没有人回答这个问题.我正在尝试从HLS处理PCM数据,我必须使用AVPlayer.

这篇文章点击本地文件 https://chritto.wordpress.com/2013/01/07/processing-avplayers-audio-with-mtaudioprocessingtap/

这个点击工作与远程文件,但不与.m3u8 hls文件. http://venodesigns.net/2014/01/08/recording-live-audio-streams-on-ios/

我可以在播放列表中播放前两个曲目,但它不会启动所需的回调来获取pcm,当文件是本地或远程(不是流)我仍然可以得到pcm但是它是hls不工作而我需要HLS工作

这是我的代码

//avplayer tap try
- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL*testUrl= [NSURL URLWithString:@"http://playlists.ihrhls.com/c5/1469/playlist.m3u8"];

    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:testUrl];
    self.player = [AVPlayer playerWithPlayerItem:item];

    // Watch the status property - when this is good to go, we can access the
    // underlying AVAssetTrack we need.
    [item addObserver:self forKeyPath:@"status" options:0 context:nil];

}

-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
    if(![keyPath isEqualToString:@"status"])
        return;

    AVPlayerItem *item = (AVPlayerItem *)object;
    if(item.status != AVPlayerItemStatusReadyToPlay)
        return;

    NSArray *tracks = [self.player.currentItem tracks]; …
Run Code Online (Sandbox Code Playgroud)

audio pcm http-live-streaming ios avplayer

33
推荐指数
1
解决办法
1521
查看次数

AVPlayerItem失败,AVStatusFailed,错误代码"无法解码"

我遇到了一个奇怪的问题,我希望有人可以提供帮助.

在我的iOS应用程序中,我MutableComposition通过组合用户照片库中的视频和应用程序包中的音频文件来创建带有自定义音轨的视频.然后,我使用一个AVPlayerAVPlayerItem使用我制作的自定义视频播放器将视频播放回用户.

每次创建新的合成时,资产,播放器和合成都会被清除,释放,并且它基本上从干净的初始状态开始.

一切正常,直到完成4个成功的视频创建后,每次创建播放器的其他尝试都会失败并出现错误Cannot Decode.如果我正在重新创建的视频相同,与视频的大小/长度无关,或者音频文件与第五次尝试完全失败,就像发条一样无关紧要.一旦失败,它将永远失败!

这很奇怪,因为它只是对同一个视频进行了四次解码而没有任何问题,所以突然间它失败了?所以,如果有人有线索,请告诉我.

iphone avfoundation ios avplayer

32
推荐指数
3
解决办法
2万
查看次数

ARKit SKVideoNode在渲染上播放

主要问题:

我在此之后添加此部分以澄清问题. - 我可以暂停我的视频(我不希望它在循环播放).当我的节点出现时,我的节点播放我的视频,即使它处于暂停状态.如果我的视频播放完毕,它就会出现,它会重新启动.我想删除此行为.

在我的应用程序中,我使用对象和对象SKVideoNodeAVPlayer(:URL)内部3D空间创建.我用来确定何时找到特定图像,并从那里播放视频.一切都很好,花花公子,除了每次AVPlayer进入视线时玩家决定按照自己的时间进行游戏; 但是,它可能是只要在连接到进入视野.无论哪种方式,每次节点进入相机镜头时都会播放.我用SCNNodeSCNGeometryARKit .ImageTrackingARImageAnchorSCNNodeAVPlayer

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if(keyPath == "rate") {
        print((object as! AVPlayer).rate)
    }
}
Run Code Online (Sandbox Code Playgroud)

打印出速率,它是1,但它是0.

print("Play")使用player.pause()或player.play()为我的所有函数打印出某种打印函数,并且无论何时更改速率,都不会调用它们.如何找到改变播放器速率的来源?

我检查了原始的rootnode,self.sceneview.scene.rootNode.childNodes以确保我没有创建额外的VideoNodes/SCNNodes/AVPlayers等,似乎只有1.

关于为什么SKVideoNode/AVPlayer正在作为SCNNode播放的任何想法都会使用ARKit看到相机?提前致谢!

EDIT1:

制定了一种解决方法,仅在用户单击此节点时确定

let tap = UITapGestureRecognizer(target: self, action: #selector(self!.tapGesture))
tap.delegate = self!
tap.name = "MyTap"
self!.sceneView.addGestureRecognizer(tap)
Run Code Online (Sandbox Code Playgroud)

然后在下一个函数里面,我放了

@objc func tapGesture(_ gesture:UITapGestureRecognizer) {
    let tappedNodes = self.sceneView.hitTest(gesture.location(in: gesture.view), options: [SCNHitTestOption.searchMode: 1])

    if …
Run Code Online (Sandbox Code Playgroud)

avplayer skvideonode swift scnnode arkit

32
推荐指数
1
解决办法
895
查看次数

MPNowPlayingInfoCenter在音频流停止时消失

我的应用程序播放流式音频AVPlayer,并用于MPNowPlayingInfoCenter在设备锁定屏幕上显示有关流的信息.

这在音频实际播放时工作正常,但如果流因网络减速(即我收到AVPlayerItemPlaybackStalledNotification)而停止,则信息会从锁定屏幕消失.但是如果流恢复播放,它会重新出现.

这是令人困惑的,因为当现在播放的信息从锁定屏幕消失时,它给出了应用程序已停止播放的外观.但是当锁定屏幕UI似乎表明这不会发生时,它会恢复播放.

有什么我可以做的事情来确保现在播放的信息在流应该播放时仍然可见,但目前不是由于网络速度问题?似乎保持一致的锁屏UI的唯一方法是在网络连接停止时实际终止它,这有点愚蠢但至少不会混淆.

如果更多细节会有所帮助:

  • 当应用程序获得该通知时,它唯一做的就是更新UI.
  • MPNowPlayingInfoCenter当有一个当前程序时,应用程序永远不会清除,因此只要该流应该正在播放,就应该显示非空数据.

audio avfoundation ios avplayer mpnowplayinginfocenter

31
推荐指数
1
解决办法
1238
查看次数

隐藏AVPlayerViewController中的控件 - 仅在开始时

如果将AVPlayerViewController.showsPlaybackControls设置为false,则控件将根本不显示.即使你点击屏幕.

我希望控件开始隐藏,但仍然可以通过点击来召唤它们.如果我将提到的属性设置为true,它们就会开始显示.(是的,他们在几秒钟后褪色.)有没有办法开始隐藏,但仍然可以访问?

video ios avplayer

30
推荐指数
2
解决办法
2万
查看次数