我的代码适用于普通设备,但在视网膜设备上会产生模糊图像.
有人知道我的问题的解决方案吗?
+ (UIImage *) imageWithView:(UIView *)view
{
UIGraphicsBeginImageContext(view.bounds.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
Run Code Online (Sandbox Code Playgroud) 我在从CVPixelBuffer获取UIIMage时遇到一些问题.这就是我想要的:
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer);
CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, imageDataSampleBuffer, kCMAttachmentMode_ShouldPropagate);
CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(NSDictionary *)attachments];
if (attachments)
CFRelease(attachments);
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
if (width && height) { // test to make sure we have valid dimensions
UIImage *image = [[UIImage alloc] initWithCIImage:ciImage];
UIImageView *lv = [[UIImageView alloc] initWithFrame:self.view.frame];
lv.contentMode = UIViewContentModeScaleAspectFill;
self.lockedView = lv;
[lv release];
self.lockedView.image = image;
[image release];
}
[ciImage release];
Run Code Online (Sandbox Code Playgroud)
height并且width都正确设置为相机的分辨率. image是创建但我似乎是黑色(或可能是透明的?).我不太明白问题出在哪里.任何想法,将不胜感激.
我的主要目标是从服务器流式传输视频,并在流式传输时逐帧剪切(以便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) 我已经能够使用AVFoundation的AVAssetReader类将视频帧上传到OpenGL ES纹理中.但是,它有一个警告,因为当它与AVURLAsset指向远程媒体一起使用时会失败.这个失败没有很好的记录,我想知道是否有任何解决方法的缺点.
我正在使用AVPlayer播放.m3u8文件.使用AVAssetImageGenerator使用以下代码从中提取图像:
AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:mp.contentURL options:nil];
AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
generate1.appliesPreferredTrackTransform = YES;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 2);
CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
img = [[UIImage alloc] initWithCGImage:oneRef];
Run Code Online (Sandbox Code Playgroud)
它总是给我错误:
错误域= AVFoundationErrorDomain代码= -11800"操作无法完成"UserInfo = 0x7fb4e30cbfa0 {NSUnderlyingError = 0x7fb4e0e28530"操作无法完成.(OSStatus error -12782.)",NSLocalizedFailureReason =发生未知错误(-12782) ),NSLocalizedDescription =操作无法完成}
它适用于mp4,mov和所有主要视频扩展URL但不适用于m3u8.任何的想法??
这是我的第一个问题,所以不要太严厉.
我正在使用AVPlayer从网上播放视频.I输出使用当前帧AVPlayerItemVideoOutput附接到AVPlayerItem通过所播放的AVPlayer.要检查新帧是否准备就绪,我调用[AVPlayerItemVideoOutput hasNewPixelBufferForItemTime],然后使用OpenGL ES输出它.如果我读取mp4,一切都很完美,但如果我尝试读取m3u8,它可以工作约1秒钟(~30帧),但在此期间[AVPlayerItemVideoOutput hasNewPixelBufferForItemTime]开始仅返回FALSE,因此当前帧不会更新.
如果我在此问题首次发生之前使用[AVPlayer seekToTime]寻找当前帧,则一切正常.
测试我使用的m3u8视频:
http://195.16.112.71/adaptive/3006a26a-9154-4b38-a327-4fa2a2381ae6.video/3006a26a-9154-4b38-a327-4fa2a2381ae6.m3u8
Run Code Online (Sandbox Code Playgroud)
为了重现这个问题,我修改了Apple的AVPlayerDemo示例,这里是:https://yadi.sk/d/T2aVGoKnWmf5Z
主要的变化在于我调用[AVPlayerDemoPlaybackViewController update]调用提到的[AVPlayerItemVideoOutput hasNewPixelBufferForItemTime].此函数具有静态变量计数器,用于存储成功[AVPlayerItemVideoOutput copyPixelBufferForItemTime]调用的数量.
视频网址在[AVPlayerDemoPlaybackViewController setURL]中设置,它在函数的开头硬编码.默认情况下,它的值指向m3u8视频,它会再现问题,在这种情况下,具有该索引的帧[AVPlayerItemVideoOutput hasNewPixelBufferForItemTime]仅返回FALSE 后,计数器的平均值约为30 .
在使用其他视频Url的情况下(参见[AVPlayerDemoPlaybackViewController setURL]的开头- 还有一个可以取消注释的替代Url),所有帧都被成功读取.
任何帮助将不胜感激!
在最近的一个项目中,我必须使用 AV Foundation 单独访问我的视频的所有帧。此外,如果可能的话,随机访问它们(如数组)
我试图研究这个问题,但没有得到任何有用的信息。
注意:是否有任何有用的文档来熟悉 AV Foundation ?