在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,因为它有一些严重的限制.我希望能够一次播放多个视频流.
在弄清楚如何使用Apple的硬件加速视频框架来解压缩H.264视频流时,我遇到了很多麻烦.几个星期后,我想出来,想分享一个广泛的例子,因为我找不到一个.
我的目标是提供WWDC '14会议513中介绍的Video Toolbox的全面,有启发性的示例.我的代码将无法编译或运行,因为它需要与基本H.264流集成(如从文件读取视频或从在线等流式传输),并且需要根据具体情况进行调整.
我应该提一下,除了我在谷歌搜索主题时学到的东西,我对视频/解码的经验很少.我不知道有关视频格式,参数结构等的所有细节,所以我只包括我认为你需要知道的内容.
我正在使用XCode 6.2并已部署到运行iOS 8.1和8.2的iOS设备.
我正在使用AVFoundation的AVPlayer播放由1个较长视频制作的2个视频片段(因此第一个片段的结尾与第二个片段的开头相匹配)
当第一个视频结束并且用户点击时,我创建一个新的AVPlayer并将其分配给我的PlayerView,并开始播放第二个剪辑.
这一切都有效,然而,有一个突出的屏幕"闪烁".
我的假设是,这是由玩家视图删除第一个剪辑然后显示第二个剪辑引起的.
我需要的是这个闪烁没有出现,因此在两个剪辑之间进行无缝连接.
有没有人知道是否有办法通过AVPlayer*类来阻止这个flickr,或者通过做某事来"伪造"它以使其不可见.
谢谢
下面是我的加载和播放方法的代码:
- (void)loadAssetFromFile
{
NSURL *fileURL = nil;
switch (playingClip)
{
case 1:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3a" withExtension:@"mp4"];
break;
case 2:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3b" withExtension:@"mp4"];
break;
case 3:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3c" withExtension:@"mp4"];
break;
case 4:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3d" withExtension:@"mp4"];
break;
default:
return;
break;
}
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
NSString *tracksKey = @"tracks";
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
^{
// The completion …Run Code Online (Sandbox Code Playgroud) 我正在尝试在AVSampleBufferDisplayLayer上循环播放视频。我可以让它播放一次,没有问题。但是,当我尝试循环播放时,它不会继续播放。
根据对AVFoundation的再现视频循环的答案,没有办法倒带AVAssetReader,所以我重新创建了它。(我确实看到了用AVFoundation AVPlayer循环播放视频的答案吗?但是AVPlayer具有更多功能。我正在读取文件,但仍希望AVSampleBufferDisplayLayer。)
一种假设是,我需要停止某些H264标头,但是我不知道这是否有帮助(以及如何帮助)。另一个是它与CMTimebase有关,但是我尝试了几件事都没有用。
以下代码基于Apple的WWDC关于直接访问视频编码的演讲:
- (void)viewDidLoad {
[super viewDidLoad];
NSString *filepath = [[NSBundle mainBundle] pathForResource:@"sample-mp4" ofType:@"mp4"];
NSURL *fileURL = [NSURL fileURLWithPath:filepath];
AVAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
UIView *view = self.view;
self.videoLayer = [[AVSampleBufferDisplayLayer alloc] init];
self.videoLayer.bounds = view.bounds;
self.videoLayer.position = CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds));
self.videoLayer.videoGravity = AVLayerVideoGravityResizeAspect;
self.videoLayer.backgroundColor = [[UIColor greenColor] CGColor];
CMTimebaseRef controlTimebase;
CMTimebaseCreateWithMasterClock( CFAllocatorGetDefault(), CMClockGetHostTimeClock(), &controlTimebase );
self.videoLayer.controlTimebase = controlTimebase;
CMTimebaseSetTime(self.videoLayer.controlTimebase, CMTimeMake(5, 1));
CMTimebaseSetRate(self.videoLayer.controlTimebase, 1.0);
[[view layer] addSublayer:_videoLayer];
dispatch_queue_t assetQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, …Run Code Online (Sandbox Code Playgroud) 我是 swift 新手,我正在尝试制作一个 Mac OS 应用程序,在应用程序启动后,使用 AVPlayer 作为窗口背景从应用程序的资源中循环播放视频。当用户选择菜单项/单击按钮时,背景视频将立即更改为与应用程序资源不同的视频,并开始循环该视频作为窗口的背景。
\n\n一旦应用程序启动,我就能够按照本教程播放第一个视频:(https://youtu.be/QgeQc587w70),并且我还按照这篇文章成功地使视频本身无缝循环:(无缝循环AVPlayer)。
\n\n我现在面临的问题是,一旦选择了菜单项/单击了按钮,就将视频更改为另一个视频。我想要的方法是更改 url 并使用新 URL 创建一个新的 AVPlayer,并将其影响到这篇文章之后的playerView.player:(Swift How to update url of video in AVPlayer when Click on a Button?)。但是,每次选择菜单项时,应用程序都会崩溃并出现错误“线程 1 exc_bad_instruction (code=exc_i386_invop subcode=0x0)”。这显然是由于playerView的值为nil引起的。我不太明白这样做的原因,因为playerView是我使用xib文件创建的AVPlayerView对象,并通过控制拖动链接到swift文件,而且我似乎找不到另一种合适的方法来做到这一点我想做。如果您知道其原因以及解决方法,请向我提供一些帮助,或者如果您知道执行我上面提到的更好方法,也请告诉我。任何帮助将非常感激!
\n\n我的代码如下,导致应用程序崩溃的行位于底部:
\n\nimport Cocoa\nimport AppKit\nimport AVKit\nimport AVFoundation\n\nstruct videoVariables {\n static var videoName = "Test_Video" //declaring the video name as a global variable\n}\n\n var videoIsPlaying = true\n var theURL = Bundle.main.url(forResource:videoVariables.videoName, withExtension: "mp4") //creating the video url\n var player = …Run Code Online (Sandbox Code Playgroud) avfoundation ×3
avplayer ×3
ios ×3
objective-c ×3
swift ×2
video ×2
avplayerview ×1
h.264 ×1
ios8 ×1
macos ×1
xcode ×1