我正在寻找解码iPhone上本地mpeg-4视频帧的最快方法.我只是对每10帧中像素的亮度值感兴趣.我不需要在任何地方渲染视频.
我已经尝试过ffmpeg,AVAssetReader,ImageAssetGenerator,OpenCV和MPMoviePlayer,但它们都太慢了.我能得到的最快速度是2倍(一分钟内扫描2分钟).我想要接近10倍的东西.
假设我上面的尝试没有使用GPU,有没有办法用GPU上运行的东西来实现我的目标?OpenGL似乎主要用于渲染输出,但我已经看到它用作传入视频的过滤器.也许这是一个选择?
提前致谢!
在StackOverflow的其他地方,有人询问深度缓冲直方图 - 使用GLSL创建深度缓冲直方图纹理.
我正在编写一个iOS图像处理应用程序,并对此问题很感兴趣,但对提供的答案不清楚.那么,是否可以通过GLSL使用GPU创建图像直方图?
我想知道AVFoundation中是否有任何公共API或任何其他可用于记录屏幕的框架,如Talking Tom Cat.我查看了AVFoundation和CoreVideo框架,但无法从头文件中找到任何内容.
如果有人知道如何使用iPhone SDK以电子方式录制屏幕视频,请告诉我.
我需要在iOS上编写OpenGL ES二维渲染器.它应该将一些原始元素(如线和多边形)绘制到2d图像中(它将呈现矢量图).哪种方式最适合从该任务中获取OpenGL上下文中的图像?我的意思是,我应该将这些基元渲染成纹理,然后从中获取图像,或者是什么?此外,如果有人提供看起来像我需要的示例或教程(2d GL渲染到图像中),那将是很棒的.提前致谢!
我正在使用glReadPixels将数据读入CVPixelBufferRef.我用它CVPixelBufferRef作为输入AVAssetWriter.不幸的是,像素格式似乎不匹配.
我认为glReadPixels返回RGBA格式的AVAssetWriter像素数据,同时想要ARGB格式的像素数据.将RGBA转换为ARGB的最佳方法是什么?
这是我到目前为止所尝试的:
CGImageRef作为中间步骤位操作不起作用,因为CVPixelBufferRef似乎不支持下标.该CGImageRef中间步骤做的工作......但我不希望有代码50条额外的线路,有可能正影响性能.
在iOS 5中,引入了OpenGL ES Texture缓存,以提供从摄像机视频数据到OpenGL的直接方式,而无需复制缓冲区.会话414中简要介绍了纹理缓存--Windows 2011中iOS 5的OpenGL ES的进展.
我发现了一篇有趣的文章,最后进一步滥用了这个概念,并glReadPixels通过简单地锁定纹理,然后直接访问缓冲区来绕过调用.
glReadPixels由于iPad 2中使用的基于图块的渲染器(即使只使用1x1纹理),因此速度非常慢.但是,所描述的方法似乎处理得比glReadPixels.
文章中提出的方法是否有效,是否可以用于提升依赖的应用程序glReadPixels?
由于OpenGL与CPU并行处理图形数据,因此在CVPixelBufferLockBaseAddress不与OpenGL交谈的情况下,如何在完成渲染时知道调用?
我有 SCNView,屏幕中间有一些对象,用户可以旋转它、缩放等。
我想在视频中记录所有这些动作并实时添加一些声音。另外,我只想记录SCNView的中间部分(例如SCNView框架是375x812,但我只想中间375x375,没有顶部和底部边框)。我还想在视频捕获的同时将其显示在屏幕上。
我当前的变体是:
func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
DispatchQueue.main.async {
if let metalLayer = self.sceneView.layer as? CAMetalLayer, let texture = metalLayer.currentSceneDrawable?.texture, let pixelBufferPool = self.pixelBufferPool {
//1
var maybePixelBuffer: CVPixelBuffer? = nil
let status = CVPixelBufferPoolCreatePixelBuffer(nil, pixelBufferPool, &maybePixelBuffer)
guard let pixelBuffer = maybePixelBuffer else { return }
CVPixelBufferLockBaseAddress(pixelBuffer, [])
let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)
let region = MTLRegionMake2D(Int(self.fieldOfView.origin.x * UIScreen.main.scale),
Int(self.fieldOfView.origin.y * UIScreen.main.scale),
Int(self.fieldOfView.width * UIScreen.main.scale),
Int(self.fieldOfView.height * UIScreen.main.scale))
let pixelBufferBytes = CVPixelBufferGetBaseAddress(pixelBuffer)!
texture.getBytes(pixelBufferBytes, …Run Code Online (Sandbox Code Playgroud) 我使用的API只给出了纹理对象的整数id,我需要将该纹理的数据传递给AVAssetWriter来创建视频.
我知道如何从像素缓冲区(CVPixelBufferRef)创建CVOpenGLESTexture对象,但在我的情况下,我必须以某种方式复制只有id可用的纹理数据.
换句话说,我需要将opengl纹理复制到基于pixelbuffer的纹理对象.可能吗?如果是,那怎么样?
在我的示例代码中,我有类似的东西:
void encodeFrame(Gluint textureOb)
{
CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferAdaptor pixelBufferPool], &pixelBuffer[0]);
CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, pixelBuffer[0],
NULL, // texture attributes
GL_TEXTURE_2D,
GL_RGBA, // opengl format
(int)FRAME_WIDTH,
(int)FRAME_HEIGHT,
GL_BGRA, // native iOS format
GL_UNSIGNED_BYTE,
0,
&renderTexture[0]);
CVPixelBufferLockBaseAddress(pixelBuffer[pixelBuffernum], 0);
//Creation of textureOb is not under my control.
//All I have is the id of texture.
//Here I need the data of textureOb somehow be appended as a video frame.
//Either by copying the data to pixelBuffer or somehow pass the textureOb …Run Code Online (Sandbox Code Playgroud) 我使用glReadPixels抓取我的opengl场景的屏幕截图,然后在IOS 4上使用AVAssetWriter将它们转换为视频.我的问题是我需要将alpha通道传递给视频,该视频只接受kCVPixelFormatType_32ARGB和glReadPixels检索RGBA.所以基本上我需要一种方法将我的RGBA转换为ARGB,换句话说,首先放置alpha字节.
int depth = 4;
unsigned char buffer[width * height * depth];
glReadPixels(0,0,width, height, GL_RGBA, GL_UNSIGNED_BYTE, &buffer);
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer), width*height*depth, NULL );
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
CGImageRef image = CGImageCreate(width, height, 8, 32, width*depth, CGColorSpaceCreateDeviceRGB(), bitmapInfo, ref, NULL, true, kCGRenderingIntentDefault);
UIWindow* parentWindow = [self window];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil];
CVPixelBufferRef pxbuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options, &pxbuffer);
NSParameterAssert(status == kCVReturnSuccess);
NSParameterAssert(pxbuffer …Run Code Online (Sandbox Code Playgroud)