我遇到了一个奇怪的问题,我希望有人可以提供帮助.
在我的iOS应用程序中,我MutableComposition
通过组合用户照片库中的视频和应用程序包中的音频文件来创建带有自定义音轨的视频.然后,我使用一个AVPlayer
并AVPlayerItem
使用我制作的自定义视频播放器将视频播放回用户.
每次创建新的合成时,资产,播放器和合成都会被清除,释放,并且它基本上从干净的初始状态开始.
一切正常,直到完成4个成功的视频创建后,每次创建播放器的其他尝试都会失败并出现错误Cannot Decode
.如果我正在重新创建的视频相同,与视频的大小/长度无关,或者音频文件与第五次尝试完全失败,就像发条一样无关紧要.一旦失败,它将永远失败!
这很奇怪,因为它只是对同一个视频进行了四次解码而没有任何问题,所以突然间它失败了?所以,如果有人有线索,请告诉我.
之前已经讨论过如何循环AVPlayer
播放视频项目,但没有"解决方案"足够无缝以提供无延迟的视频循环.
我正在开发一个tvOS应用程序,它的一个视图背景中有一个高质量的10秒"风景"剪辑,只需重新启动它的AVPlayer"标准"方式(订阅NSNotification
捕获它)太疯狂了注意并减损用户体验.
似乎实现真正无缝循环的唯一方法是在较低级别(在OpenGL中)手动管理帧...
尽管我已尽最大努力阅读此内容,并且作为操纵视频流水线的新手,我还没有达到一个易于理解的解决方案.
我知道存在外部库可以更容易地执行此行为; 最值得注意的是GPUImage.但是,我正在开发的应用程序是针对tvOS的,因此很难使用相当多的第三方iOS库,包括GPUImage.我遇到的另一个库是AVAnimator,它为轻量级动画视频提供了强大的功能,但不能用于.H264中编码的源素材的密集,高质量视频剪辑.
到目前为止,我最接近的是Apple自己的AVCustomEdit源代码,但这主要涉及静态生成"过渡",虽然无缝,但过于复杂,我无法辨别如何使其执行简单的循环功能.
如果任何人都可以在AVPlayer
较低级别操作,即使用图像处理/缓冲区(或者不依赖于外部库的iOS开发),我会非常有兴趣知道如何开始.
每次,当我尝试使用 播放兆字节视频时AVPlayer
,它首先会显示一秒钟的白屏,然后开始播放视频。
如果视频已经缓存,为什么会发生这种情况?有没有办法阻止这种情况发生,以便它直接进入视频而不显示白屏?
我尝试使用AVPlayer
'sisReady
检查视频的状态AVPlayer
并仅在视频准备就绪时播放视频,但它仍然显示白屏。
另外,每次当我尝试获取即将播放的视频的视频持续时间时,AVPlayer
我最初都会得到 0.0 秒,所以我也无法向视频添加计时器,因为我无法获取视频持续时间,因为它持续显示白屏一秒钟。
我正在使用 AVQueuePlayer 循环播放所有选定的视频或通过滑动手势更改视频。
但是当我实现流程时,当用户滑动将视频从一个视频更改为另一个视频时,会出现黑框。因此,为了克服这个问题,我使用了 UIImageView。
我所做的是,当用户滑动下一个视频时,我处理当前时间的视频并拍摄相同的图像并初始化为 imageview 直到下一个视频在队列中可用。下面是用于实现此解决方案的代码
var player : AVQueuePlayer?
var playerItem: [AVPlayerItem] = []
let tempCurrentIndex = currentIndex
let tempPlayerItems = self.playerItem
guard let currentAssest = self.player?.currentItem?.asset else {return}
let playerCurrentTime = CMTimeGetSeconds(player!.currentTime())
let newTime = playerCurrentTime + 0.0
self.player?.pause()
self.imgvwFlick.image = UIImage()
self.imgvwFlick.image = self.getFrame(asset: currentAssest, time: newTime)
self.player?.removeAllItems()
for i in tempCurrentIndex + 1..<tempPlayerItems.count {
tempPlayerItems[i].seek(to: .zero, toleranceBefore: .zero, toleranceAfter: .zero, completionHandler: nil)
self.player?.insert(tempPlayerItems[i], after: nil)
}
self.player?.seek(to: .zero, toleranceBefore: .zero, toleranceAfter: .zero)
self.currentIndex = …
Run Code Online (Sandbox Code Playgroud) 我已经进行了大量研究,但由于多种原因尚未找到可行的解决方案,我将在下面概述。
在我的 iOS 应用程序中,我需要三个视图来无限期地显示设备相机的延迟实时预览。
例如,视图1将显示相机视图,延迟5秒,视图2将显示相同的相机视图,延迟20秒,视图3将显示相同的相机视图,延迟30秒。
这将用于记录您自己执行某种活动,例如锻炼练习,然后在几秒钟后观察自己,以完善您的特定练习形式。
我尝试并研究了几种不同的解决方案,但都有问题。
AVFoundation
和AVCaptureMovieFileOutput
:AVCaptureSession
和AVCaptureMovieFileOutput
将短片录制到设备存储中。需要短剪辑,因为您无法播放 URL 中的视频,并同时写入同一 URL。AVPlayer
个AVPlayerLayer
实例,全部按所需的时间延迟播放录制的短片。AVPlayer.replaceCurrentItem(_:)
,剪辑之间存在非常明显的延迟。这需要一个平稳的过渡。AVPlayer
由于设备限制不要创建多个实例。我还没有找到证实或否认这一说法的信息。E:根据 Jake G 的评论 -AVPlayer
对于 iPhone 5 及更新版本来说 10 次就可以了。AVFoundation
和AVCaptureVideoDataOutput
:AVCaptureSession
和AVCaptureVideoDataOutput
来通过委托方法流式传输和处理摄像机输入的每一帧didOutputSampleBuffer
。GLKViewWithBounds
)。AVPlayer
这解决了来自 的多个实例的问题Solution 1.
。ios ×5
avfoundation ×4
video ×3
avplayer ×2
avplayeritem ×1
camera ×1
iphone ×1
objective-c ×1
opengl-es ×1
snapchat ×1
swift ×1
tvos ×1