- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用的 API 只提供纹理对象的整数 ID,我需要将该纹理的数据传递给 AVAssetWriter 以创建视频。
我知道如何从像素缓冲区 (CVPixelBufferRef) 创建 CVOpenGLESTexture 对象,但在我的例子中,我必须以某种方式复制只有 id 可用的纹理数据。
换句话说,我需要将一个 opengl 纹理复制到我的基于像素缓冲区的纹理对象。可能吗?如果是那么怎么办?
在我的示例代码中,我有类似的东西:
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 to the Adaptor.
[assetWriterPixelBufferAdaptor appendPixelBuffer:pixelBuffer[0] withPresentationTime:presentationTime];
}
感谢提示和答案。
附言glGetTexImage
在 iOS 上不可用。
更新:
@博士。 Larson,我无法为 API 设置纹理 ID。实际上我不能指示第 3 方 API 使用我自己创建的纹理对象。
看完答案后,我明白我需要:
1- 将像素缓冲区关联的纹理对象作为颜色附件附加到 texFBO。对于每一帧:
2-绑定(bind)从API获取的纹理
3- 绑定(bind) texFBO 并调用 drawElements
我在这段代码中做错了什么?
附言我还不熟悉着色器,所以我现在很难使用它们。
更新 2:在 Brad Larson 的回答的帮助下,使用正确的着色器解决了这个问题。我不得不使用着色器,这是 Opengl ES 2.0 的基本要求
最佳答案
要从 iOS 上的 OpenGL ES 读回数据,基本上有两条路线:使用 glReadPixels()
,或使用纹理缓存(仅限 iOS 5.0+)。
您只有一个纹理 ID 而无法访问其他任何东西这一事实有点奇怪,并且限制了您在此处的选择。如果您无法设置要在此第三方 API 中使用的纹理,您将需要将该纹理重新渲染到屏幕外帧缓冲区以使用 glReadPixels()
为其提取像素。或纹理缓存。为此,您需要使用与纹理大小相同的 FBO、一个简单的四边形(两个三角形组成一个矩形)和一个直通着色器,它只会在输出帧缓冲区中显示纹理的每个纹素。
此时,您可以使用 glReadPixels()
将字节拉回到 CVPixelBufferRef 的内部字节数组中,或者最好使用纹理缓存来消除读取的需要。我在 this answer 中描述了如何为该方法设置缓存,以及如何将其输入 AVAssetWriter。您需要将屏幕外 FBO 设置为使用 CVPixelBufferRef 的关联纹理作为渲染目标才能正常工作。
但是,如果您有办法设置此渲染纹理使用的 ID,则可以避免重新渲染它以获取其像素值。像我在上面链接的答案中描述的那样设置纹理缓存,并将该像素缓冲区的纹理 ID 传递到您正在使用的第三方 API。然后它将渲染到与像素缓冲区关联的纹理中,您可以直接从中记录。这就是我用来在我的 GPUImage 框架中加速从 OpenGL ES 录制视频的方法(使用 glReadPixels()
方法作为 iOS 4.x 的后备)。
关于iphone - 将纹理复制到 PixelBuffer (CVPixelBufferRef),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16716085/
我想从图像创建视频。 所以,我是引用链接的来源。 链接:CVPixelBufferPool Error ( kCVReturnInvalidArgument/-6661) func writeAnim
如何将 CVPixelBufferRef 转换为 NSImage 或 CGImageRef?我需要能够在核心动画层中显示像素缓冲区的内容。 最佳答案 要将缓冲区转换为图像,您需要首先将缓冲区转换为 C
我正在使用 GPUImage 库函数来操作 CVPixelbuffer 的高度和宽度。我正在录制纵向视频,当用户旋转设备时,我的屏幕会自动调整为横向模式。我希望横向框架适合屏幕。 例如:- 我以 32
我使用的 API 只提供纹理对象的整数 ID,我需要将该纹理的数据传递给 AVAssetWriter 以创建视频。 我知道如何从像素缓冲区 (CVPixelBufferRef) 创建 CVOpenGL
我正在做一个项目,在这个项目中我从 UIImage 生成一个视频,代码是我在这里找到的,我现在正在努力优化它几天(对于大约 300 张图像,它需要大约 5 分钟模拟器,并且由于内存而在设备上崩溃)。
我正在使用 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 录制视频和音频,并在 captureOutput:didOutputSampleBu
我正在使用 AVComposition 编写一些视频处理代码。仅提供必要的背景详细信息,我从我无法控制的苹果 API 收到一个 CVPixelBuffer。这个 CVPixel 缓冲区包含一个先前渲染
我正在尝试根据用户的输入裁剪和缩放 CMSampleBufferRef,在 ratio 上,下面的代码采用 CMSampleBufferRef,将其转换为 CVImageBufferRef 并使用 C
我正在使用 glReadPixels 将数据读入 CVPixelBufferRef。我使用 CVPixelBufferRef 作为 AVAssetWriter 的输入。不幸的是,像素格式似乎不匹配。
我是 iOS 编程和多媒体的新手,我正在研究一个名为 RosyWriter 的示例项目,该项目由 apple 在 this link 提供。 .在这里,我看到在代码中有一个名为 captureOutp
我正在我的 iOS 应用程序中录制实时视频。在另一个 Stack Overflow page ,我发现您可以使用 vImage_Buffer 处理我的帧。 问题是我不知道如何从输出的 vImage_b
我们曾经像下面这样初始化 CVPixelBufferRef。 CVPixelBufferRef pxbuffer = NULL; 但是在 Swift 中我们不能使用 NULL,所以我们尝试了下面的
在 objective-c 中,您可以轻松地将 CVImageBufferRef 转换为 CVPixelBufferRef: CMSampleBufferRef sampleBuffer = some
我想将 UIImage 对象转换为 CVPixelBufferRef 对象,但我完全不知道。而且我找不到执行此类操作的任何示例代码。 有人可以帮帮我吗?提前致谢! 你好 最佳答案 有不同的方法可以做到
我正在使用 BlackMagic DeckLink SDK 尝试从 BM 设备捕获帧。 我正在尝试从 DeckLinkController::VideoInputFrameArrived 回调中的 I
尝试在 SCNRender 对象的每次调用渲染上从 MTLTexture 创建 CVPixelBufferRef: CVPixelBufferLockBaseAddress(pixelBuffer
我需要创建一个 CVPixelBufferRef 的副本,以便能够使用副本中的值以按位方式操作原始像素缓冲区。我似乎无法使用 CVPixelBufferCreate 或 CVPixelBufferCr
如何从 CVPixelBufferRef 获取 RGB(或任何其他格式)像素值?我尝试了很多方法,但都没有成功。 func captureOutput(captureOutput: AVCapture
我正在使用 AVCaptureSession 和 AVCapturePhotoOutput 以 kCVPixelFormatType_14Bayer_RGGB 格式从设备相机捕获 RAW 照片数据。
我正在编写自定义电影录制应用程序,并实现了 AVAssetWriter 和 AVAssetWriterInputPixelBufferAdaptor 以将帧写入文件。在 DataOutputDeleg
我是一名优秀的程序员,十分优秀!