我试图通过iPhone上的AVAudioPlayer播放(非常短 - 少于2秒)的音频文件来消除启动延迟.
一,代码:
NSString *audioFile = [NSString stringWithFormat:@"%@/%@.caf", [[NSBundle mainBundle] resourcePath], @"audiofile"];
NSData *audioData = [NSData dataWithContentsOfMappedFile:audioFile];
NSError *err;
AVAudioPlayer *audioPlayer = [(AVAudioPlayer*)[AVAudioPlayer alloc] initWithData:audioData error:&err];
audioPlayer.delegate = self;
[audioPlayer play];
Run Code Online (Sandbox Code Playgroud)
一旦完成,我还实现了audioPlayerDidFinishPlaying方法来释放AVAudioPlayer.
我第一次播放音频时滞后是显而易见的 - 至少2秒.然而,之后立即播放声音.我怀疑那个罪魁祸首是[NSData dataWithContentsOfMappedFile]最初从闪存中读取了很长时间,但后来读取速度很快.不过,我不确定如何测试.
是这样的吗?如果是这样,我是否应该预先缓存NSData对象并积极地在低内存条件下清除它们?
我正在使用AVPlayer播放视频.它们的长度很短,2-5秒.它们以随机顺序播放.问题是,当改变视频,并且新视频开始播放时,设备会滞后很短的时间,但我不会变得流畅.有没有办法用AVPlayer预加载视频?
我正在使用AVPlayer远程网址播放mp3文件.我对mp3的初始加载时间有一些问题,它非常慢(大约5-8秒).
我将它与其他第三方玩家进行了比较,速度要慢得多,我也将它与Android玩家进行了比较,而且速度也慢得多.
所以问题不在于网址本身,也不在于网络连接.
另一个有趣的一点是,在AVPlayer开始播放mp3后,寻求非常快(几乎立即),这是否意味着播放器在开始播放前下载整个mp3文件,这就是它如此慢的原因?
我可以控制这种行为吗?如果没有,任何其他想法可能是什么原因?
当我从互联网上加载视频(10-40MB大)时,我无法提供流畅的播放体验.
我的AVPlayer要么加载整个视频然后播放,要么播放1s缓冲区然后停止播放.
我尝试了无穷无尽的库,缓冲区观察器方法和教程.似乎没有任何帮助.
.
.
.
self.makeLoaderVisible()
let playerItem = AVPlayerItem(url: url)
playerItem.addObserver(self, forKeyPath: "playbackBufferEmpty", options: .new, context: nil)
playerItem.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .new, context: nil)
playerItem.addObserver(self, forKeyPath: "playbackBufferFull", options: .new, context: nil)
avPlayer?.replaceCurrentItem(with: playerItem)
avPlayer?.automaticallyWaitsToMinimizeStalling = false
avPlayer?.playImmediately(atRate: 0)
// avPlayer?.play()
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if object is AVPlayerItem {
switch keyPath! {
case "playbackBufferEmpty":
// Show loader
makeLoaderVisible()
case "playbackLikelyToKeepUp":
// Hide loader
hideLoader()
case "playbackBufferFull": …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,用户最多可以录制6个视频片段,每个片段的持续时间为2秒.当录制视频剪辑时,用户可以使用6个按钮进行播放 - 每个剪辑一个.然后,用户可以通过在6个剪辑之间切换来录制电影.问题是,当用户按下按钮时,我需要在6个剪辑之间进行近乎瞬时的切换 - 否则会丢失播放剪辑的错觉 - 该功能有点类似于App Store中名为CamBox的应用程序.
每当用户按下按钮时,我首先尝试使用AVPlayer中的AvPlayerItem和AVAsset初始化每个剪辑.播放器的输出在我的主视图中指向AVPlayerLayer.问题是加载和开始播放所花费的时间很长,这意味着当用户快速连续按下按钮时视频会滞后.
我决定尝试使用5个AVPlayers和5个AVPlayerLayers预加载所有剪辑.5 PlayerLayers被插入到我的主视图中,当用户按下按钮时,当前正在播放的AVPlayer被暂停和倒回,并且当前可见的AVPlayerLayer被隐藏.启动新的AVPlayer并显示相应的AVPlayerLayer.它工作得比我的第一个解决方案快得多,虽然不是瞬间但问题是我只能预加载4个剪辑,这意味着当用户按下播放最后两个按钮的按钮时,它会滞后很长时间.下面是我预加载剪辑的代码
-(void)loadVideos
{
layers = [[NSMutableArray alloc] initWithCapacity:6];
players = [[NSMutableArray alloc] initWithCapacity:6];
for(int i = 1; i < 7; i++)
{
NSURL* fileURL = [NSURL fileURLWithPath:[self getFileName:i]];
AVPlayerItem* avPlayerItem = [[[AVPlayerItem alloc] initWithURL:fileURL] autorelease];
[avPlayerItem addObserver:self forKeyPath:@"status" options:0 context:nil];
AVPlayer *avPlayer = [[[AVPlayer alloc] initWithPlayerItem:avPlayerItem] autorelease];
[avPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
[avPlayer addObserver:self forKeyPath:@"currentItem" options:0 context:nil];
AVPlayerLayer* layer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
layer.frame = self.playerView.bounds;
[playerView.layer addSublayer:layer];
[layers addObject:layer];
[players …Run Code Online (Sandbox Code Playgroud)