Tag: avcomposition

AVAssetExportSession – 在IOS中join2个mp4文件

我试图用以下代码将2个预先存在的mpeg4video连接到一个ipad2上。 -(void)mergeTestVideos { //setup asset NSString *firstassetpath = [NSString stringWithFormat:@"%@mpeg4-1.mp4", NSTemporaryDirectory()]; NSString *secondassetpath = [NSString stringWithFormat:@"%@mpeg4-2.mp4", NSTemporaryDirectory()]; NSFileManager *fileManager = [NSFileManager defaultManager]; AVAsset *firstAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:firstassetpath]]; AVAsset *secondAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:secondassetpath]]; NSLog(@"FirstAsset Is Readable = %d", firstAsset.isReadable); NSLog(@"FirstAsset Is playable = %d", firstAsset.isPlayable); NSLog(@"FirstAsset Is exportable = %d", firstAsset.exportable); NSLog(@"SecondAsset Is Readable […]

自定义AVVideoCompositing类不按预期方式工作

我正在尝试将CIFilter应用于AVAsset,然后使用应用的filter进行保存。 我这样做的方式是通过使用videoComposition的AVMutableVideoComposition设置为具有自定义AVVideoCompositing类的AVMutableVideoComposition对象。 我还将AVMutableVideoComposition对象的instructions设置为自定义组合指令类(符合AVMutableVideoCompositionInstruction )。 这个类传递一个跟踪ID,以及一些其他不重要的variables。 不幸的是,我遇到了一个问题 – 我的自定义video合成器类(符合AVVideoCompositing )中的startVideoCompositionRequest:函数未被正确调用。 当我将自定义指令类的passthroughTrackIDvariables设置为轨道ID时, startVideoCompositionRequest(request)函数不会被调用。 然而,当我没有设置我的自定义指令类的passthroughTrackIDvariables, startVideoCompositionRequest(request) 被调用,但不正确 – 打印request.sourceTrackIDs结果为一个空数组, request.sourceFrameByTrackID(trackID)结果为零值。 有趣的是,我发现cancelAllPendingVideoCompositionRequests:函数在尝试使用filter导出video时总是被调用两次。 它可以在startVideoCompositionRequest:之前被调用一次,也可以在startVideoCompositionRequest:未被调用的情况下连续两次。 我创build了三个类,用于filter导出video。 这里是实用程序类,它基本上只包含一个export函数,并调用所有必需的代码 class VideoFilterExport{ let asset: AVAsset init(asset: AVAsset){ self.asset = asset } func export(toURL url: NSURL, callback: (url: NSURL?) -> Void){ guard let track: AVAssetTrack = self.asset.tracksWithMediaType(AVMediaTypeVideo).first else{callback(url: nil); return} let composition = AVMutableComposition() let […]

精确的AVMutableComposition时间

我试图用AVMutableComposition在精确的时间播放一系列声音文件。 当视图加载时,我创build了这个组合,意图是在1秒内均匀播放4个声音。 不pipe声音有多长或多短都不重要,我只想在0,0.25,0.5和0.75秒的时间点发射它们: AVMutableComposition *composition = [[AVMutableComposition alloc] init]; NSDictionary *options = @{AVURLAssetPreferPreciseDurationAndTimingKey : @YES}; for (NSInteger i = 0; i < 4; i++) { AVMutableCompositionTrack* track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; NSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"sound_file_%i", i] withExtension:@"caf"]; AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:options]; AVAssetTrack *assetTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject; CMTimeRange timeRange = [assetTrack […]

iOS – AVAssestExportSession只能在播放AVPlayer后导出最多8首曲目

我试图循环录制的video的一些片段,并将它们合并成一个video。 我已经成功合并和导出了一个多达16首曲目的作品。 但是当我在合并之前尝试使用AVPlayer播放这个作品时,我最多只能导出8首曲目。 首先,我创buildAVComposition和AVVideoComposition +(void)previewUserClipDanceWithAudio:(NSURL*)videoURL audioURL:(NSURL*)audioFile loop:(NSArray*)loopTime slowMotion:(NSArray*)slowFactor showInViewController:(UIViewController*)viewController completion:(void(^)(BOOL success, AVVideoComposition* videoComposition, AVComposition* composition))completion{ AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init]; NSMutableArray *arrayInstruction = [[NSMutableArray alloc] init]; AVMutableVideoCompositionInstruction *videoCompositionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; AVURLAsset *audioAsset = [[AVURLAsset alloc]initWithURL:audioFile options:nil]; //NSLog(@"audio File %@",audioFile); CMTime duration = kCMTimeZero; AVAsset *currentAsset = [AVAsset assetWithURL:videoURL]; BOOL isCurrentAssetPortrait = YES; for(NSInteger […]

将一个HTTPstream插入一个AVMutableComposition

我试图插入AVPlayerItem的AVPlayerItemStatusReadyToPlay到AVMutableComposition像这样: composition_ = [[AVMutableComposition alloc] init]; insertionPoint_ = kCMTimeZero; item_ = [[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]] retain]; [item_ addObserver:self forKeyPath:@"status" options:0 context:nil]; player_ = [[AVPlayer playerWithPlayerItem:item_] retain]; [player_ addObserver:self forKeyPath:@"currentItem.duration" options:0 context:nil]; /** * append a player-item to our composition */ – (void)addItemToComposition:(AVPlayerItem *)item { NSError *error = nil; VTRACE(@"item duration: %g", CMTimeGetSeconds(item.duration)); if (![composition_ insertTimeRange:CMTimeRangeMake(kCMTimeZero, item.duration) […]

AVPlayer和AVURLAssets的渐进式video下载

我们正在开发一个应用程序,需要通过AVPlayer播放video文件。 这些文件需要存储在用户的设备上,而且还必须在下载时播放。 目前我们已经构build了一个下载模块,它使用ASIHTTPRequest库通过PHP获取video文件(我们不希望媒体可以通过公共URL链接),并将它们asynchronous写入磁盘。 然后根据AV Foundation编程指南设置AVPlayer,使用AVURLAsset获取文件,使用资产制作AVPlayerItem,使用AVPlayer生成项目,然后将播放器设置为AVPlayerLayer。 播放器运行正常,完全下载的video文件,也将在模拟器中完美运行逐步下载的文件。 不幸的是,在实际的设备上,播放器的行为发生了变化,反而看起来像载入一次video,而不会尝试从磁盘抓取新的数据包。 结果是播放器将播放video和audio直到video中标记下载进度是在资产被加载的时间点 (例如,如果2MB的数据被缓冲,那么播放器被创build,播放器将只玩到2MB的数据)。 由于它具有video的标题,因此播放器会高兴地继续认为它正在播放video的整个持续时间,但是没有其他video呈现在屏幕上。 最后的一个问题是,如果video被插入到AVComposition中,并且AVPlayer被创build,那么渐进video将会播放正常。 这将是一个很好的解决scheme(无论如何我们的应用程序有时是必要的),除了我们的应用程序的客户端需要video可以通过AirPlay播放的Apple TV,这AVCompositions是不能的。 有谁知道是否有一种方法可以使用AVURLAssets构build的AVPlayer逐步下载video文件? 有没有办法强制播放器/ playerItem从AVURLAsset读取磁盘的方式似乎与AVComposition,而不是看起来caching在内存中的video? 谢谢!

如何将静止图像添加到AVComposition?

我有一个AVMutableComposition与一个video轨道,我想添加一个静态图像到video轨道,以显示一段时间。 静止图像只是一个PNG。 我可以加载图像作为资产,但这是关于它,因为生成的资产没有任何轨道,因此不能使用insertTimeRange…方法插入。 有没有办法将静止图像添加到作品? 看起来答案是在Core Animation的某个地方,但是整个事情似乎高于我的头,我将不胜感激代码示例或一些信息指针。

使用AVPlayer和AVMutableComposition进行未alignment的声音播放

我正尝试使用AVComposition从多个乐器样本创build一首歌曲。 当我用kCMTimeZero在AVMutableComposition播放两个声音资产时,我希望他们可以同时播放,但有一个很小的偏移量。 这只会发生在第一个playthrough,所以这似乎是某种加载延迟,但不pipe我尝试它不会消失。 我已经确保预加载音轨资源,预加载合成音轨,等待playerItem准备好,然后等待播放器准备好播放。 我尝试过预卷播放器,播放/暂停播放,等等。第一次播放时,音轨之间总会有轻微的偏移。 我已经创build了一个小样本项目来演示这里的效果 主要代码在这里 请注意,当你第一次加载应用程序,并播放时,声音略有偏移。 随后重复的声音(和同一个playerItem的重放)没有这个问题。 延迟最初的声音似乎解决了这个问题,但这不是一个很好的select。 任何想法,如果这可以修复或如果我失去了一些东西? 谢谢

AVPlayer的多个video

我正在开发iPad的iOS应用程序,需要在屏幕的某个部分播放video。 我有几个video文件需要按照编译时没有给出的顺序播放。 它看起来好像只是一个video播放。 当从一个video到另一个video时,这两个video的最后一帧或最后一帧显示有一些延迟,但是没有内容的闪烁或白色屏幕应该是不错的。 video不包含audio。 考虑到内存使用情况非常重要。 这些video具有非常高的分辨率,并且可以同时播放几个不同的video序列。 为了获得这个,我已经尝试了几个解决scheme。 如下所列: AVPlayer与AVComposition与其中的所有video 在这个解决scheme中,我有一个AVPlayer,它只能在AVPlayerItem上使用,AVPlayerItem使用包含所有放在一起的video的AVComposition。 当我去看具体的video的时候,我试图在下一个video开始的时候进行合成。这个解决scheme的问题是,当寻找播放器的时候会很快显示出它正在寻找的一些帧,这是不可接受的。 似乎没有办法直接跳到组合中的特定时间。 我试图通过在刚刚完成的video中制作最后一帧的图像来解决这个问题,然后在AVPLayer的前面显示该图像,最后在查找完成后将其删除。 我正在使用AVAssetImageGenerator制作图像,但出于某种原因,图像的质量与video不一样,所以在显示和隐藏图像时会有显着的变化。 另一个问题是,AVPlayer使用大量的内存,因为一个AVPlayerItem保存所有的video。 AVPlayer有多个AVPlayerItems 此解决scheme为每个video使用AVPlayerItem,并在切换到新video时replaceAVPlayer的项目。 这个问题是,当切换一个AVPlayer的项目时,它会显示一个白色的屏幕短时间加载新的项目。 为了解决这个问题,可以使用在加载的同时在最后一帧放置图像的解决scheme,但是仍然存在图像和video的质量不同且显着的问题。 3.两个AVPlayers彼此轮stream播放AVPlayerItem 我试过的下一个解决scheme是将两个AVPlayer放在一起,然后轮stream播放AVPlayerItems。 所以当玩家完成游戏时,它将停留在video的最后一帧。 另一个AVPlayer将被带到前面(其项目设置为零,所以它是透明的),并且下一个AVPlayerItem将被插入到该AVPlayer中。 一旦它被加载,它将开始播放,两个video之间的顺利交易的幻想将完好无损。 这个解决scheme的问题是内存使用情况。 在某些情况下,我需要同时在屏幕上播放两个video,这将导致4个AVPlayers同时载入一个AVPlayerItem。 由于video的分辨率可能很高,因此记忆体太多了。 有没有人有一些想法,build议,意见或有关整体的问题和上述张贴的解决办法。