如何在xcode中避免此警告.这是代码片段:
[player(AVPlayer object) addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(0.1, 100)
queue:nil usingBlock:^(CMTime time) {
current+=1;
if(current==60)
{
min+=(current/60);
current = 0;
}
[timerDisp(UILabel) setText:[NSString stringWithFormat:@"%02d:%02d",min,current]];///warning occurs in this line
}];
Run Code Online (Sandbox Code Playgroud) cocoa-touch objective-c retain avplayer automatic-ref-counting
在AVFoundation中有一种相对简单的循环视频方式吗?
我已经创建了我的AVPlayer和AVPlayerLayer:
avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];
avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];
Run Code Online (Sandbox Code Playgroud)
然后我播放我的视频:
[avPlayer play];
Run Code Online (Sandbox Code Playgroud)
视频播放正常但最后停止播放.使用MPMoviePlayerController,您只需将其repeatMode属性设置为正确的值即可.AVPlayer似乎没有类似的属性.似乎没有一个回调可以告诉我什么时候电影结束所以我可以寻找开头并再次播放它.
我没有使用MPMoviePlayerController,因为它有一些严重的限制.我希望能够一次播放多个视频流.
我有一个简短的mp4视频文件,我已添加到我当前的Xcode6 Beta项目中.
我想在我的应用中播放视频.
经过几个小时的搜索,我找不到任何远程帮助.有没有办法用Swift完成这个或你必须使用Objective-C?我可以指出正确的方向吗?我不能成为唯一想知道这一点的人.
请注意,对于以下问题:所有资产都是设备上的本地资产 - 没有网络流媒体正在发生.视频包含音轨.
我正在开发一个iOS应用程序,它需要播放视频文件,延迟时间最短才能启动相关视频剪辑.不幸的是,在我们真正需要启动之前,我们不知道下一个具体的视频剪辑.具体来说:当播放一个视频片段时,我们将知道下一组(大约)10个视频片段是什么,但我们不知道究竟是哪一个,直到"立即"播放下一个片段为止.
我看到实际启动延迟的做法是调用addBoundaryTimeObserverForTimes视频播放器,时间段为1毫秒,以查看视频实际开始播放的时间,并且我将该时间戳与第一个时间戳区别开来.指示开始播放哪个资产的代码.
从我迄今为止看到的情况来看,我发现使用AVAsset加载的组合,然后AVPlayerItem在它准备就绪之后创建一个,然后AVPlayerStatusReadyToPlay在我调用play之前等待,往往需要1到3秒才能启动夹.
我已经切换到我认为大致相同的东西:打电话[AVPlayerItem playerItemWithURL:]等待AVPlayerItemStatusReadyToPlay比赛.大致相同的性能.
我观察到的一件事是第一个AVPlayer项目加载比其余项目慢.似乎有一个想法是在尝试播放第一个视频之前用短/空资产预先飞行AVPlayer可能是一个很好的通用做法.[ AVAudioPlayer第一次播放声音时启动缓慢
我希望尽可能地缩短视频开始时间,并且有一些可以尝试的东西的想法,但是希望得到任何可能提供帮助的人的指导.
更新:下面的想法7,实施时产生大约500毫秒的切换时间.这是一个改进,但它更快更好.
想法1:使用N AVPlayers(不起作用)
使用~10个AVPPlayer对象并启动和暂停所有~10个剪辑,一旦我们知道我们真正需要哪个,切换到并取消暂停正确AVPlayer,并在下一个循环中重新开始.
我认为这不起作用,因为我已经读过AVPlayer'siOS中大约有4个活动限制.这里有人在StackOverflow上询问这个问题,并发现了4个AVPlayer限制:快速切换 - 视频 - 使用 - 基础
想法2:使用AVQueuePlayer(不起作用)
我不相信将10推AVPlayerItems入一个AVQueuePlayer会预加载它们以便无缝启动. AVQueuePlayer是一个队列,我认为这只会使队列中的下一个视频准备好立即播放.我不知道我们想要播放的约10个视频中的哪一个,直到开始那个视频.IOS-avplayer视频预载
想法3:AVPlayerItems在后台加载,播放和保留(不是100%确定 - 但看起来不太好)
我正在考虑在后台加载和播放每个视频片段的第一秒是否有任何好处(抑制视频和音频输出),并保持对每个视频片段的引用AVPlayerItem,当我们知道需要播放哪个项目时真实的,交换那个,并将背景AVPlayer与活动的交换.冲洗并重复.
理论上说,最近播放AVPlayer/AVPlayerItem的可能仍会保留一些准备好的资源,这会使后续播放更快.到目前为止,我还没有看到这方面的好处,但我可能没有AVPlayerLayer正确的背景设置.我怀疑这会从我所看到的事情中真正改善.
想法4:使用不同的文件格式 - 也许加载速度更快?
我目前正在使用.m4v(视频-MPEG4)H.264格式.H.264有很多不同的编解码器选项,因此有些选项可能比其他选项更快.我发现使用更高级的设置使文件大小更小会增加搜索时间,但是没有找到任何相反的选项.
想法5:无损视频格式+ AVQueuePlayer的组合
如果有一种可以快速加载的视频格式,但也许文件大小是疯狂的,那么一个想法可能是预先准备每个视频片段的前10秒,其版本臃肿但加载速度更快,但是使用H.264编码的资产.使用AVQueuePlayer,以未压缩文件格式添加前10秒,然后使用H.264中的一个,最多可达10秒的准备/预加载时间.因此,我将获得两个世界中"最好的":快速启动时间,还可以从更紧凑的格式中获益.
想法6:使用非标准AVPlayer /自己编写/使用别人的
鉴于我的需求,也许我不能使用AVPlayer,但必须求助于AVAssetReader,并解码前几秒(可能将原始文件写入磁盘),当涉及到播放时,请使用原始格式来播放它回来快.对我来说似乎是一个巨大的项目,如果我以天真的方式去做,那就不清楚/不太可能更好地工作了.每个解码和未压缩的视频帧为2.25 MB.天真地说 - 如果我们以约30 fps的速度播放视频,我最终会得到~60 MB/s的磁盘读取要求,这可能是不可能的/推动它.显然我们必须进行一定程度的图像压缩(也许是通过PVRTC进行原生的openGL/es压缩格式)......但这有点疯狂.也许有一个我可以使用的图书馆?
想法7:将所有内容组合到一个电影资产中,并搜索到当前时间
一个可能比上面的一些更容易的想法是将所有内容组合成一个电影,并使用seekToTime.问题是我们会四处奔跑.基本上随机访问电影.我认为这可能实际上没问题: …
有没有办法知道AVPlayer播放是否已经停止或到达终点?
我正在开发一个需要播放视频的iPhone应用程序.到目前为止,我了解到实现这一目标至少有两个API; AVPlayer和MPMoviePlayerController.
有哪些主要区别?
我环顾四周,但我找不到代表协议AVPlayer class.是什么赋予了?
我正在使用它的子类,AVQueuePlayer来播放一个数组AVPlayerItems,每个数组都从一个URL加载.有什么方法可以在歌曲播放完毕后调用方法吗?特别是在队列的最后?
如果那是不可能的,那么在缓冲之后,当歌曲STARTS播放时,我有什么方法可以调用方法吗?我正试图在那里获得一个加载图标,但它会在音乐实际开始之前关闭图标,即使它是在[audioPlayer play]动作之后.
我正在尝试播放一个MP3传递给UIView前一个文件的文件UIView(存储在一个NSURL *fileURL变量中).
我正在初始化一个AVPlayer:
player = [AVPlayer playerWithURL:fileURL];
NSLog(@"Player created:%d",player.status);
Run Code Online (Sandbox Code Playgroud)
我想的NSLog印刷品Player created:0,意味着它尚未准备好播放.
当我点击播放时UIButton,我运行的代码是:
-(IBAction)playButtonClicked
{
NSLog(@"Clicked Play. MP3:%@",[fileURL absoluteString]);
if(([player status] == AVPlayerStatusReadyToPlay) && !isPlaying)
// if(!isPlaying)
{
[player play];
NSLog(@"Playing:%@ with %d",[fileURL absoluteString], player.status);
isPlaying = YES;
}
else if(isPlaying)
{
[player pause];
NSLog(@"Pausing:%@",[fileURL absoluteString]);
isPlaying = NO;
}
else {
NSLog(@"Error in player??");
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我总是进入Error in player??控制台.然而,如果我用一个简单的...... 替换if检查是否 …
我正在使用AVPlayerHTTP直播的无线电应用程序.现在我想为该音频流实现一个电平表.最好的水平仪显示不同的频率,但简单的左/右解决方案将是一个很好的起点.
我发现了几个使用的例子AVAudioPlayer.但我无法找到解决所需信息的解决方案AVPlayer.
有人能想到我的问题的解决方案吗?
编辑我想创建这样的东西(但更好)

编辑二
一个建议是用于MTAudioProcessingTap获取原始音频数据.我可以使用[[[_player currentItem] asset] tracks]数组找到的例子,在我的例子中,是一个空数组.另一个建议是使用[[_player currentItem] audioMix]哪个null适合我.
编辑III
经过多年,似乎仍然没有解决方案.我确实取得了进步,所以我正在分享它.
在设置过程中,我正在向playerItem添加一个键值观察器:
[[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL];
//////////////////////////////////////////////////////
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context
if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) {
for (AVPlayerItemTrack *itemTrack in [object tracks]) {
AVAssetTrack *track = [itemTrack assetTrack];
if ([[track mediaType] isEqualToString:AVMediaTypeAudio]) {
[self addAudioProcessingTap:track];
break;
}
}
}
- …Run Code Online (Sandbox Code Playgroud) avplayer ×10
ios ×8
objective-c ×6
avfoundation ×5
iphone ×3
swift ×2
cocoa-touch ×1
delay ×1
ios4 ×1
media-player ×1
retain ×1