QTKit(QuickTime Kit)是10.3天的Mac框架,例如在10.5中添加了一些图层QTMovieLayer.QTMovieLayer的一个好处是你可以使用content图层上的常规属性访问电影内容并获取一个CAImageQueue对象.这样做的好处是你可以创建一堆常规CALayers并将图像队列设置为它们的内容,并通过设置正确的方式为所有图层提供它们自己的电影部分contentRect.这意味着您可以创建类似下图的图像,只运行一部电影,同时获得同步和内存效率.

我可以发布这段代码,但我怀疑它与我的问题有关,因为问题是iOS和QTKit在那里不存在.
我想在iOS上做同样的事情,但那里不存在QTKit.也就是说,我正在寻找存在于iOS 上的content QTMovieLayer的替代品,其中属性不是nil(这是重要的部分),以便我可以在多个层之间共享内容.
此外,当我设法让视频在多个层中播放时,我希望能够指定视频的哪个部分应该在哪个层中播放(如上图所示)
在iOS上,您可以使用AVFoundation或MediaPlayer框架来播放电影.在AVFoundation中,您AVPlayerLayer可以显示电影.(您还可以AVCaptureVideoPreviewLayer显示摄像机输入的预览和AVSynchronizedLayer同步但不显示视频).
注意: 在所有这些示例中,我成功地将视频播放到包含声音和所有内容的图层中.那不是我的问题.问题是我无法将内容与其他图层共享.
我已阅读技术说明TN2300 - 将QTKit代码转换为AV Foundation但无法找到有关在图层之间共享视频内容的任何信息.
如果我创建一个这样的玩家图层并尝试让contents我只nil回来
NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"video" withExtension:@"m4v"];
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
[player play];
AVPlayerLayer *videoLayer = [AVPlayerLayer playerLayerWithPlayer:player];
id videoContent = videoLayer.contents // <-- this is nil :(
Run Code Online (Sandbox Code Playgroud)
即使我真的对播放电影文件感兴趣,但我尝试使用捕获预览图层,但内容与之前一样是零
AVCaptureDevice *device = [AVCaptureDevice …Run Code Online (Sandbox Code Playgroud) 我正在更新一个64位兼容的应用程序,但我的电影录制代码有点困难.我们有一个FireWire相机,它将YUV帧提供给我们的应用程序,我们在MPEG4电影中处理和编码到磁盘.目前,我们使用基于C的QuickTime API来执行此操作(使用图像压缩管理器等),但旧的QuickTime API不支持64位.
我的第一次尝试是使用QTKit的QTMovie并使用编码单个帧-addImage:forDuration:withAttributes:,但这需要为每个帧创建一个NSImage(这在计算上是昂贵的)并且它不进行时间压缩,因此它不会生成最紧凑的文件.
我想使用像QTKit Capture的QTCaptureMovieFileOutput这样的东西,但是我无法弄清楚如何将原始帧提供给与QTCaptureInput无关的原始帧.由于我们需要手动控制增益,曝光等,因此我们无法直接将相机与QTKit Capture配合使用.
在Lion上,我们现在拥有AVFoundation中的AVAssetWriter类,可以让你这样做,但我仍然需要暂时定位Snow Leopard,所以我也想找到一个在那里工作的解决方案.
因此,有没有办法对视频进行非QuickTime逐帧录制,这种录制比QTMovie更高效,-addImage:forDuration:withAttributes:并且生成的文件大小可与旧版QuickTime API相媲美?
我试图使用Python(版本2.7或2.6)和PyObjC(版本2.2)从内置到Macbook Pro中的Apple iSight摄像头捕获单帧.
作为一个起点,我使用了这个旧的StackOverflow问题.为了验证它是否有意义,我交叉引用了它似乎基于的Apple的MyRecorder示例.不幸的是,我的脚本不起作用.
我的重要问题是:
在下面粘贴的示例脚本中,预期的操作是在调用startImageCapture()之后,我应该从CaptureDelegate开始打印"Got a frame ..."消息.但是,相机的指示灯从不打开,代表的回调永远不会执行.
此外,在startImageCapture()期间没有失败,所有函数声称成功,并且它成功找到iSight设备.分析pdb中的会话对象表明它具有有效的输入和输出对象,输出具有分配的委托,设备未被其他进程使用,并且在调用startRunning()之后会话被标记为正在运行.
这是代码:
#!/usr/bin/env python2.7
import sys
import os
import time
import objc
import QTKit
import AppKit
from Foundation import NSObject
from Foundation import NSTimer
from PyObjCTools import AppHelper
objc.setVerbose(True)
class CaptureDelegate(NSObject):
def captureOutput_didOutputVideoFrame_withSampleBuffer_fromConnection_(self, captureOutput,
videoFrame, sampleBuffer,
connection):
# This should get called for every captured frame
print "Got a frame: %s" % videoFrame
class QuitClass(NSObject):
def quitMainLoop_(self, aTimer):
# Just stop the main loop. …Run Code Online (Sandbox Code Playgroud) 自Snow Leopard以来,QTKit现在从QTMovies frameImageAtTime:withAttributes:error:等函数返回色彩校正图像数据.给定未压缩的AVI文件,在Snow Leopard vs. Leopard中显示具有更大像素值的相同图像数据.
目前我正在使用frameImageAtTime来获取NSImage,然后请求该图像的tiffRepresentation.执行此操作后,Snow Leopard中的像素值略高.
例如,Leopard中具有以下像素值的文件:
[0 180 0]
Run Code Online (Sandbox Code Playgroud)
现在有一个像素值,如:
[0 192 0]
Run Code Online (Sandbox Code Playgroud)
有没有办法向QTMovie询问没有色彩校正的视频帧?我应该要求CGImageRef,CIImage或CVPixelBufferRef吗?有没有办法在读取视频文件之前完全禁用颜色校正?
我试图通过使用NSCalibratedColroSpace绘制到NSBitmapImageRep来解决这个问题,但这只是我的一部分:
// Create a movie
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys :
nsFileName, QTMovieFileNameAttribute,
[NSNumber numberWithBool:NO], QTMovieOpenAsyncOKAttribute,
[NSNumber numberWithBool:NO], QTMovieLoopsAttribute,
[NSNumber numberWithBool:NO], QTMovieLoopsBackAndForthAttribute,
(id)nil];
_theMovie = [[QTMovie alloc] initWithAttributes:dict error:&error];
// ....
NSMutableDictionary *imageAttributes = [NSMutableDictionary dictionary];
[imageAttributes setObject:QTMovieFrameImageTypeNSImage forKey:QTMovieFrameImageType];
[imageAttributes setObject:[NSArray arrayWithObject:@"NSBitmapImageRep"] forKey: QTMovieFrameImageRepresentationsType];
[imageAttributes setObject:[NSNumber numberWithBool:YES] forKey:QTMovieFrameImageHighQuality];
NSError* err = nil;
NSImage* image = (NSImage*)[_theMovie frameImageAtTime:frameTime withAttributes:imageAttributes error:&err];
// copy NSImage into …Run Code Online (Sandbox Code Playgroud) 我想使用AVFoundation在osx上显示视频.我想在运行时从原始数据初始化电影.根据这个文件:https ://developer.apple.com/library/mac/#technotes/tn2300/_index.htmlAVAsset相当于QTKit的 QTMovie.QTMovie具有movieWithData:error:从数据加载视频的功能,而我找不到类似的东西AVAsset.那么,有可能在AVFoundation中做同样的事情吗?
谢谢
在我正在编写的cocoa应用程序中,我从Quartz Composer渲染器(NSImage对象)获取快照图像,我想使用addImage在720*480大小,25 fps和H264编解码器的QTMovie中对它们进行编码: 方法.这是相应的代码片段:
qRenderer = [[QCRenderer alloc] initOffScreenWithSize:NSMakeSize(720,480) colorSpace:CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB) composition:[QCComposition compositionWithFile:qcPatchPath]]; // define an "offscreen" Quartz composition renderer with the right image size
imageAttrs = [NSDictionary dictionaryWithObjectsAndKeys: @"avc1", // use the H264 codec
QTAddImageCodecType, nil];
qtMovie = [[QTMovie alloc] initToWritableFile: outputVideoFile error:NULL]; // initialize the output QT movie object
long fps = 25;
frameNum = 0;
NSTimeInterval renderingTime = 0;
NSTimeInterval frameInc = (1./fps);
NSTimeInterval myMovieDuration = 70;
NSImage * myImage;
while (renderingTime <= myMovieDuration){
if(![qRenderer renderAtTime: renderingTime arguments:NULL]) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用cocoa从网络摄像头抓取图像.我可以使用QTKit和didOutputVideoFrame委托调用获取RGBA格式的图像,并将CVImageBuffer转换为CIImage然后转换为NSBitmapImageRep.
我知道我的相机在YUV中本地抓取,我想要的是直接从CVImageBuffer获取YUV数据,并在显示之前处理YUV帧.
我的问题是:如何从CVImageBuffer获取YUV数据?
谢谢.
我正在使用QTKit逐步从URL下载和播放MP3.根据此文档,这是我应该用来完成的代码:
NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar.mp3"];
NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithURL:mp3URL error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)
这有效,并且完全符合我的要求 - MP3 URL被懒散地下载并立即开始播放.但是,如果URL没有".mp3"路径扩展名,则会失败:
NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar"];
NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithURL:mp3URL error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)
没有给出错误,没有引发异常; 声音的持续时间只是设置为零,没有任何播放.
我找到解决此问题的唯一方法是通过手动加载数据并使用QTDataReference强制类型:
NSURL *mp3URL = [NSURL URLWithString:@"http://foo.com/bar"];
NSData *mp3Data = [NSData dataWithContentsOfURL:mp3URL];
QTDataReference *dataReference =
[QTDataReference dataReferenceWithReferenceToData:mp3Data
name:@"bar.mp3"
MIMEType:nil];
NSError *error = nil;
QTMovie *sound = [[QTMovie alloc] initWithDataReference:dataReference error:&error];
[sound play];
Run Code Online (Sandbox Code Playgroud)
然而,这迫使我在开始播放之前同步完全下载所有MP3,这显然是不可取的.有没有办法解决?
谢谢.
实际上,路径扩展似乎与它无关; …
我需要从一系列生成的图像中创建一部电影.(我正在根据物理建模程序的输出创建图像.)
我在QtKitCreateMovie中找到了Apple的样本并将其作为起点.我没有从应用程序包中加载jpgs,而是绘制到NSImage,然后将NSImage添加到电影对象中.这是我用于测试的基本代码.mMovie是一个实例QTMovie:
NSImage *anImage = [[NSImage alloc] initWithSize:NSMakeSize(frameSize, frameSize)];
[anImage lockFocus];
float blendValue;
for (blendValue = 0.0; blendValue <= 1.0; blendValue += 0.05) {
[[[NSColor blueColor] blendedColorWithFraction:blendValue ofColor:[NSColor redColor]] setFill];
[NSBezierPath fillRect:NSMakeRect(0, 0, frameSize, frameSize)];
[mMovie addImage:anImage forDuration:duration withAttributes:myDict];
}
[anImage unlockFocus];
[anImage release];
Run Code Online (Sandbox Code Playgroud)
这在OS X 10.5下工作,但在OS X 10.6下,我在调用时获得了超出边界异常的数组索引addImage:forDuration:withAttributes:(http://openradar.appspot.com/radar?id=1146401)
在10.6下制作电影的正确方法是什么?
此外,虽然这可以在10.5下工作,但如果我尝试创建一个包含数千帧的电影,我的内存就会耗尽.这也让我觉得我没有使用正确的方法.
我们正在开发一个OSX应用程序,必须得到OSX 10.7到10.9的支持.我们目前正在使用QTKit和QTMovieView来显示视频,但在最近尝试上传新版本时,我们收到以下错误消息:
Deprecated API usage. Apple no longer accepts submissions of apps that use QuickTime APIs.
Run Code Online (Sandbox Code Playgroud)
我们还测试了将Base SDK设置为10.8,但结果相同.
更改为AVKit和AVPlayerView不适用于10.9之前的版本.
那么有没有办法将AVKit用于10.9之前的版本或某种方式用QTKit发布应用程序?