- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 AVPlayerLayer,我想从中创建一个 OpenGL 纹理。我对 opengl 纹理很满意,甚至对将 CGImageRef 转换为 opengl 纹理也很满意。在我看来,下面的代码应该可以工作,但我得到的只是纯黑色。我究竟做错了什么?我需要先在 CALayer/AVPlayerLayer 上设置任何属性吗?
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
int width = (int)[layer bounds].size.width;
int height = (int)[layer bounds].size.height;
CGContextRef context = CGBitmapContextCreate(NULL,
width,
height,
8,
width * 4,
colorSpace,
kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
if (context== NULL) {
ofLog(OF_LOG_ERROR, "getTextureFromLayer: failed to create context 1");
return;
}
[[layer presentationLayer] renderInContext:context];
CGImageRef cgImage = CGBitmapContextCreateImage(context);
int bytesPerPixel = CGImageGetBitsPerPixel(cgImage)/8;
if(bytesPerPixel == 3) bytesPerPixel = 4;
GLubyte *pixels = (GLubyte *) malloc(width * height * bytesPerPixel);
CGContextRelease(context);
context = CGBitmapContextCreate(pixels,
width,
height,
CGImageGetBitsPerComponent(cgImage),
width * bytesPerPixel,
CGImageGetColorSpace(cgImage),
kCGImageAlphaPremultipliedLast);
if(context == NULL) {
ofLog(OF_LOG_ERROR, "getTextureFromLayer: failed to create context 2");
free(pixels);
return;
}
CGContextDrawImage(context, CGRectMake(0.0, 0.0, width, height), cgImage);
int glMode;
switch(bytesPerPixel) {
case 1:
glMode = GL_LUMINANCE;
break;
case 3:
glMode = GL_RGB;
break;
case 4:
default:
glMode = GL_RGBA; break;
}
if(texture.bAllocated() == false || texture.getWidth() != width || texture.getHeight() != height) {
NSLog(@"getTextureFromLayer: allocating texture %i, %i\n", width, height);
texture.allocate(width, height, glMode, true);
}
// test texture
// for(int i=0; i<width*height*4; i++) pixels[i] = ofRandomuf() * 255;
texture.loadData(pixels, width, height, glMode);
CGContextRelease(context);
CFRelease(cgImage);
free(pixels);
附言变量 'texture' 是我知道有效的 C++ opengl(-es 兼容)纹理对象。如果我取消注释“测试纹理”for 循环用随机噪声填充纹理,我可以看到,所以问题肯定在之前。
为了回应 Nick Weaver 的回复,我尝试了一种不同的方法,现在我总是从状态 == 3 (AVAssetReaderStatusFailed) 的 copyNextSampleBuffer 返回 NULL。我错过了什么吗?
AVPlayer *videoPlayer;
AVPlayerLayer *videoLayer;
AVAssetReader *videoReader;
AVAssetReaderTrackOutput*videoOutput;
videoPlayer = [[AVPlayer alloc] initWithURL:[NSURL fileURLWithPath:[NSString stringWithUTF8String:videoPath.c_str()]]];
if(videoPlayer == nil) {
NSLog(@"videoPlayer == nil ERROR LOADING %s\n", videoPath.c_str());
} else {
NSLog(@"videoPlayer: %@", videoPlayer);
videoLayer = [[AVPlayerLayer playerLayerWithPlayer:videoPlayer] retain];
videoLayer.frame = [ThreeDView instance].bounds;
// [[ThreeDView instance].layer addSublayer:videoLayer]; // test to see if it's loading and running
AVAsset *asset = videoPlayer.currentItem.asset;
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], (NSString*)kCVPixelBufferPixelFormatTypeKey, nil];
videoReader = [[AVAssetReader alloc] initWithAsset:asset error:nil];
videoOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:[tracks objectAtIndex:0] outputSettings:settings];
[videoReader addOutput:videoOutput];
[videoReader startReading];
}
if(videoPlayer == 0) {
ofLog(OF_LOG_WARNING, "Shot::drawVideo: videoPlayer == 0");
return;
}
if(videoOutput == 0) {
ofLog(OF_LOG_WARNING, "Shot::drawVideo: videoOutput == 0");
return;
}
CMSampleBufferRef sampleBuffer = [videoOutput copyNextSampleBuffer];
if(sampleBuffer == 0) {
ofLog(OF_LOG_ERROR, "Shot::drawVideo: sampleBuffer == 0, status: %i", videoReader.status);
return;
}
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CFRelease(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
unsigned char *pixels = ( unsigned char *)CVPixelBufferGetBaseAddress(imageBuffer);
int width = CVPixelBufferGetWidth(imageBuffer);
int height = CVPixelBufferGetHeight(imageBuffer);
if(videoTexture.bAllocated() == false || videoTexture.getWidth() != width || videoTexture.getHeight() != height) {
NSLog(@"Shot::drawVideo() allocating texture %i, %i\n", width, height);
videoTexture.allocate(width, height, GL_RGBA, true);
}
videoTexture.loadData(pixels, width, height, GL_BGRA);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
最佳答案
我认为iOS4: how do I use video file as an OpenGL texture?将对您的问题有所帮助。
关于cocoa-touch - 来自 CALayer (AVPlayerLayer) 的 OpenGL 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5773197/
我使用以下命令设置 AVPlayerLayer: audioPlayer = [[AVPlayer alloc]initWithURL:[NSURL fileURLWithPath:f
我有一个自定义的UITableViewCell,它显示图像或视频。如果有视频,它会在加载并准备播放视频时首先下载并显示该视频的缩略图。 一切正常,问题是我获取缩略图的比例,将其存储在数据库中,当我下载
我有一个令人困惑的问题。我在我的类中声明了这些变量: var audioPlayer = AVPlayer() var videoPlayer = AVPlayer() var videoLayer
我一直在尝试让 AVPlayerLayer 在我的应用程序中播放从互联网上下载的视频。然而,尽管有所有在线帮助,我似乎无法让它工作。这是代码: import UIKit import CoreGrap
注意:我接受 Xamarin.iOS、Objective-C 或 Swift 中的任何答案。如果您需要帮助阅读 Xamarin 代码,我可以为您解决这个问题,但考虑到此处代码的“复杂性”,应该没问题。
我有一个奇怪的问题。我有一个表格 View ,它的单元格包含一个视频。我将 AVPlayerLayer 设置为拉伸(stretch)到单元格的大小,但是当 tableview 首次加载时,它不会这样做
我试图让 AVPlayerLayer 填充单元格空间,但是通过设置 frame 属性,它不会改变它的大小。 在我的自定义单元格文件中: override init(style: UITableVie
我正在使用 AVPlayerLayer 播放视频。视频没有声音。但是,如果用户正在后台播放音乐并且显示了 AVPlayerLayer,则音乐会停止。如果用户向上滑动并点击播放,视频将停止。 我什至已经
我有一个带有 UIImageView 的旋转木马对象,我试图在其中对 AvPlayerLayer 进行子层处理。 虽然它没有填满 _videoView 的整个边界,但它工作得很好,它的高度看起来更小,
我试图在 有时 工作的 AVPlayerLayer 中显示本地录制的视频。我可以听到录制视频的声音,但看不到视频。有时视频和音频都在工作,有时只有音频。 我已经尝试使用 AVPlayerLayer 和
每当我更改 AVPlayerLayer 的框架时,视频不会立即调整大小,而是根据新大小进行动画处理。 例如:我将帧从 (0, 0, 100, 100) 更改为 (0, 0, 400, 400), Vi
我有两种观点 其中一个是AVPlayerLayer的容器,如下所示 containerView.layer.addSublayer(playerLayer) containerView 有自己关于 s
我正在使用 AVPlayerLayer 在我的 UIViewController 实例的后台播放视频。当我在 iPhone 上启动我的应用程序时,我注意到放大镜的显示方式有误。视频规范:H.264、A
我正在开发一个应用程序,其中提要中有循环播放的视频(在表格 View 单元格内)。可以同时存在多个视频,但可能只有一个正在播放。我在后台创建 AVPlayer,并将它们的 playerLayer 作为
我似乎无法从我拥有的 URL 中获取视频的高度。每次我记录playerLayer.videoRect.bounds.size.height返回0.000。关于如何根据视频调整playerLayer的高
我看到很多人想要播放透明背景视频的帖子。这不是我在这里想要实现的目标。 我正在尝试设置整个图层的不透明度。下面是我如何设置图像层的不透明度。我尝试了相同的方法来设置视频层的不透明度,但当我尝试淡入淡出
在 Main.storyboard 窗口中添加了一个 View Controller 组件。 View as: Iphone8 选项在 Main.storyboard 窗口中被选中 TestViewC
我不想用 AVPlayerLayer 重现实时照片缩放效果。为此,我使用 VideoView: class VideoView: UIView { override class var lay
我正在尝试使用此代码显示视频: self.videoPlayer = AVPlayer.init(url: videoUrl as URL) let playerLayer = AVPlayerLay
我有一个位于 collectionView 单元中的 AVPlayer,它位于 collectionView 中,位于 collectionView 单元中。 总而言之,我的每个单元格中都有一个 Co
我是一名优秀的程序员,十分优秀!