我已经设法将一帧电影的视频轨道加载到带AVFoundation的OpenGL纹理中.我按照答案中描述的步骤进行操作:iOS4:如何将视频文件用作OpenGL纹理? 并从WWDC2010的GLVideoFrame示例中获取了一些代码,可以在此处下载:http://bit.ly/cEf0rM
如何与视频同步播放电影的音轨.我认为在单独的播放器中播放它并不是一个好主意,而是使用相同的音频轨道OpenGL.
AVAssetTrack* audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
我检索了一个videoframe,它是CADisplayLink-callback中的时间戳
CMSampleBufferRef sampleBuffer = [self.readerOutput copyNextSampleBuffer];
CMTime timestamp = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
Run Code Online (Sandbox Code Playgroud)
哪里AVFoundation是类型GLVideoFrame
如何获得相应的音频样本?以及如何玩它们?
编辑:
我看了一下,我想,最好是使用WWDC2010AudioToolbox.framework使用此处描述的方法:AVAssetReader和Audio Queue流问题
AVFoundation中还有一个音频播放器:AVAsset.但我不知道我应该如何将数据传递给它所readerOutput期望的-initializer AVAssetReaderTrackOutput*.此外,我不认为这是我的最佳选择,因为我AudioQueue必须为每个新的音频样本创建一个新的实例,据我所知.
还有其他建议吗?播放原始音频样本的最佳方式是AudioToolbox.framework什么?
是否可以在iOS中使用视频(预渲染,使用H.264压缩)作为GL的纹理?
如果可能,该怎么办?以及任何播放质量/帧速率或限制?
我正在尝试找出在GL纹理上显示视频的最佳方法,同时保留Alpha通道的透明度.
关于视频作为GL纹理的信息在这里:是否可以在iOS中使用视频作为GL的纹理?和iOS4:如何将视频文件用作OpenGL纹理?.
使用ffmpeg来帮助实现alpha透明度,而不是应用程序商店友好: iPhone:在UIView上显示半透明视频?
视频源将在绿色屏幕前拍摄,用于色度键控.视频可以不受影响而离开绿屏或在视频编辑套件中处理并导出到带有Alpha的Quicktime Animation或Apple Pro Res 4444.
我认为有多种方法可能有效,但我还没有找到完整的解决方案.
我很想了解iOS和OpenGL ES 2.0的最佳方法
谢谢.
是否有可能并且支持使用iOS硬件加速的h.264解码API来解码本地(非流式)视频文件,然后在其上组合其他对象?
我想创建一个涉及在视频前面绘制图形对象的应用程序,并使用回放计时器来同步我在顶部绘制的内容,以及在视频上播放的内容.然后,根据用户的操作,更改我在顶部绘制的内容(但不是视频)
来自Android的DirectX,OpenGL和OpenGL ES,我想象的是将视频渲染为纹理,并使用该纹理绘制全屏四边形,然后使用其他精灵来绘制其余的对象; 或者也许在渲染器之前写一个中间过滤器,这样我就可以操纵各个输出帧并绘制我的东西; 或者可以在视频顶部绘制2D图层.
似乎AV基金会或者Core Media 可以帮助我做我正在做的事情,但在我深入研究细节之前,我想知道是否有可能做我想做的事情,以及我的主要内容是什么?解决问题的途径.
请不要"这对你来说太先进,先试试你好世界"的答案.我知道我的东西,只是想知道我想做什么是可能的(最重要的是,支持,所以应用程序不会最终被拒绝),在我自己研究细节之前.
编辑:
我不熟悉iOS开发,但专业的Android版DirectX,OpenGL和OpenGL ES.我正在考虑制作我目前拥有的Android应用程序的iOS版本,我只是想知道这是否可行.如果是这样,我有足够的时间从头开始iOS开发,直到做我想做的事情.如果不可能,那么我现在不会花时间研究整个平台.
因此,这是一个技术可行性问题.我不是要求代码.我正在寻找类型的答案"是的,你可以做到这一点.只需使用A和B,使用C渲染到D并用E绘制你的东西",或者"不,你不能.硬件加速解码是不适用于第三方应用程序"(这是朋友告诉我的).就这样,我会在路上.
我已经阅读了ios技术概述第32页中的视频技术概述.它几乎说我可以使用Media Player获得最简单的播放功能(不是我想要的),UIKit用于嵌入视频,对嵌入有更多的控制,但不是实际播放(不是我的'正在寻找),AVFoundation可以更好地控制播放(也许我需要的,但我在网上找到的大部分资源都是关于如何使用相机),或者是Core Media对视频进行全面的低级控制(可能就是我需要,但记录极差,甚至比AVFoundation更缺乏回放资源.
我担心我可能会在接下来的六个月里全身心地学习iOS编程,但最终却发现相关的API不适用于第三方开发人员,而我想做的事情是iTunes商店部署是不可接受的.这是我的朋友告诉我的,但我似乎无法在应用程序开发指南中找到任何相关内容.因此,我来到这里是为了询问那些在这方面有更多经验的人,不管我想做什么都是可能的.不再.
我认为这是一个有效的高级问题,可以被误解为我不做我的作业-plz-give-me-teh-codez问题.如果我在这里的判断是错误的,请随意删除,或者将这个问题贬低到你心中的蔑视.
我有一个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); …Run Code Online (Sandbox Code Playgroud) ios ×5
opengl-es ×5
avfoundation ×2
video ×2
alpha ×1
calayer ×1
cocoa-touch ×1
h.264 ×1
ios4 ×1
iphone ×1
textures ×1
transparency ×1