用AVPlayer播放AVMutableComposition? [英] Play AVMutableComposition with AVPlayer?

查看:134
本文介绍了用AVPlayer播放AVMutableComposition?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试按顺序播放两个视频。我尝试过AVQueuePlayer,但两个片段之间有一个巨大的打嗝。我需要他们不间断地玩。

I'm trying to get two videos to play sequentially. I've tried AVQueuePlayer but there's a huge "burp" between the two clips. I need to them to play without interruption.

所以我正在尝试使用AVMutableComposition和AVPlayer,但无法正确使用。

So I'm trying to use AVMutableComposition and an AVPlayer but can't get it right.

这里是我的代码(忽略内存泄漏,只在空项目中测试..):

Here's my code (ignore memory leaks, just testing in an empty project..):

composition = [[AVMutableComposition alloc] init];

NSString * path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"];
NSURL * url = [NSURL fileURLWithPath:path];
AVURLAsset * asset = [[AVURLAsset alloc] initWithURL:url options:nil];

NSError * error = NULL;
[composition insertTimeRange:CMTimeRangeMake(CMTimeMake(0,1000),CMTimeMake(4,1000)) ofAsset:asset atTime:CMTimeMake(0,1000) error:&error];
if(error) NSLog(@"error: %@",error);

path = [[NSBundle mainBundle] pathForResource:@"chug1" ofType:@"mp4"];
url = [NSURL fileURLWithPath:path];
asset = [[AVURLAsset alloc] initWithURL:url options:nil];

error = NULL;
[composition insertTimeRange:CMTimeRangeMake(CMTimeMake(0,1000),CMTimeMake(3,1000)) ofAsset:asset atTime:CMTimeMake(4.1,1000) error:&error];
if(error) NSLog(@"error: %@",error);

AVPlayerItem * item = [[AVPlayerItem alloc] initWithAsset:composition];
AVPlayer * player = [AVPlayer playerWithPlayerItem:item];
AVPlayerLayer * layer = [AVPlayerLayer playerLayerWithPlayer:player];

[layer setFrame:CGRectMake(0, 0, 320, 480)];
[[[self view] layer] addSublayer:layer];
[player play];

代码似乎对我而言。每个视频的第一帧实际上呈现在屏幕上。但视频根本不播放。我错过了什么?我是否需要弄清楚如何使用MutableTrack的东西?

The code seems right to me. The first frame of each video is actually rendered to the screen. But the video doesn't play at all. I'm I missing something? Do I need to figure out how to use the MutableTrack stuff?

推荐答案

也许你使用错误的时间插入点和持续时间,两者都取决于实际的视频资产。我写的是这样的:

Maybe you're using the wrong time insertion points and durations, both depends on actual video assets. I'd write something like this:

CMTime insertionPoint = kCMTimeZero;
NSError * error = nil;
composition = [AVMutableComposition composition];
asset = /* obtain asset #1 */
if (![composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
                          ofAsset:asset 
                           atTime:insertionPoint 
                            error:&error]) 
{
    NSLog(@"error: %@",error);
}
insertionPoint = CMTimeAdd(insertionPoint, asset.duration);

asset = /* obtain asset #2 */
if (![composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
                          ofAsset:asset 
                           atTime:insertionPoint 
                            error:&error]) 
{
    NSLog(@"error: %@",error);
}
...
/* playback stuff */

这篇关于用AVPlayer播放AVMutableComposition?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆