我的主要目标是从服务器流式传输视频,并在流式传输时逐帧剪切(以便OpenGL可以使用它).为此,我使用了我在互联网上随处可见的代码(我记得它来自Apple的GLVideoFrame示例代码):
NSArray * tracks = [asset tracks];
NSLog(@"%d", tracks.count);
for(AVAssetTrack* track in tracks) {
NSLog(@"type: %@", [track mediaType]);
initialFPS = track.nominalFrameRate;
width = (GLuint)track.naturalSize.width;
height = (GLuint)track.naturalSize.height;
NSError * error = nil;
// _movieReader is a member variable
@try {
self._movieReader = [[[AVAssetReader alloc] initWithAsset:asset error:&error] autorelease];
}
@catch (NSException *exception) {
NSLog(@"%@ -- %@", [exception name], [exception reason]);
NSLog(@"skipping track");
continue;
}
if (error)
{
NSLog(@"CODE:%d\nDOMAIN:%@\nDESCRIPTION:%@\nFAILURE_REASON:%@", [error code], [error domain], error.localizedDescription, [error localizedFailureReason]);
continue;
}
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; …Run Code Online (Sandbox Code Playgroud) 我花了一整天时间,经历了很多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.我正在考虑尝试,但决定在这里找到相关问题后不要浪费时间.所以,有没有办法得到我现在在屏幕上看到的东西的快照?我简直不敢相信.