我已经能够使用AVFoundation的AVAssetReader类将视频帧上传到OpenGL ES纹理中.但是,它有一个警告,因为当它与AVURLAsset指向远程媒体一起使用时会失败.这个失败没有很好的记录,我想知道是否有任何解决方法的缺点.
我花了一整天时间,经历了很多SO答案,Apple参考文献,文档等,但都没有成功.
我想要一个简单的事情:我正在使用AVPlayer播放视频,我想暂停它并获取当前帧UIImage.而已.
我的视频是一个位于互联网上的m3u8文件,它在AVPlayerLayer没有任何问题的情况下正常播放.
我试过了什么:
AVAssetImageGenerator.它不起作用,该方法copyCGImageAtTime:actualTime: error:返回null image ref.根据答案,此处 AVAssetImageGenerator不适用于流媒体视频.renderInContext:的AVPlayerLayer,但后来我意识到,这不是渲染这种"特殊"层.然后我发现了iOS 7中引入的一种新方法 - drawViewHierarchyInRect:afterScreenUpdates:它应该能够渲染特殊的图层,但没有运气,仍然可以获得带有空白黑色区域的UI快照,其中显示视频.AVPlayerItemVideoOutput.我为我添加了一个视频输出AVPlayerItem,但每当我调用hasNewPixelBufferForItemTime:它时返回NO.我想问题是再次流式传输视频,我并不孤单.AVAssetReader.我正在考虑尝试,但决定在这里找到相关问题后不要浪费时间.所以,有没有办法得到我现在在屏幕上看到的东西的快照?我简直不敢相信.
这是我用来将视频合并在一起的方法的开始
-(void) mergeVideosAndAudio:(AVAsset *)audioAsset{
//Load Video Assets
NSError *error;
NSArray *dirFiles;
if ((dirFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self documentsDirectory] error:&error]) == nil) {
// handle the error
};
// find all the temp files
NSArray *movFiles = [dirFiles filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self BEGINSWITH 'temp'"]];
NSLog(@"The are %i temp files",movFiles.count);
//Create assets array
NSMutableArray *assets = [[NSMutableArray alloc]init];
for (int i = 0; i < movFiles.count; i++) {
NSString *videoURL = [[self documentsDirectory] stringByAppendingPathComponent:
[NSString stringWithFormat:@"temp%i.mov", i]];
NSURL *url = [NSURL fileURLWithPath:videoURL];
AVURLAsset *videoAsset …Run Code Online (Sandbox Code Playgroud) 我必须从服务器访问视频,我希望能够实时访问它的帧,以便我可以对它们进行一些图像处理。
我知道如何使用 AVAssetReader 离线完成,但此解决方案不适用于实时处理。
ios ×4
avfoundation ×3
objective-c ×2
video ×2
avasset ×1
avplayer ×1
opengl-es ×1
streaming ×1
swift ×1