标签: qtkit

具有非零`内容'的QTMovieLayer的iOS替代品?

背景

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但无法找到有关在图层之间共享视频内容的任何信息.

AVPlayerLayer

如果我创建一个这样的玩家图层并尝试让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)

AVCaptureVideoPreviewLayer

即使我真的对播放电影文件感兴趣,但我尝试使用捕获预览图层,但内容与之前一样是零

AVCaptureDevice *device = [AVCaptureDevice …
Run Code Online (Sandbox Code Playgroud)

qtkit objective-c avfoundation ios

24
推荐指数
1
解决办法
1193
查看次数

什么是10.6兼容的方法,不使用QuickTime API将视频帧录制到电影?

我正在更新一个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相媲美?

macos cocoa quicktime qtkit

13
推荐指数
2
解决办法
1717
查看次数

如何使用Python和PyObjC从Apple iSight捕获帧?

我试图使用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)

python cocoa isight pyobjc qtkit

11
推荐指数
1
解决办法
4397
查看次数

如何在没有雪豹的颜色或伽马校正的情况下从QTKit获取图像数据?

自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)

quicktime qtkit gamma

8
推荐指数
1
解决办法
1321
查看次数

Cocoa:来自原始数据的AVAsset(即NSData)

我想使用AVFoundation在osx上显示视频.我想在运行时从原始数据初始化电影.根据这个文件:https ://developer.apple.com/library/mac/#technotes/tn2300/_index.htmlAVAsset相当于QTKit的 QTMovie.QTMovie具有movieWithData:error:从数据加载视频的功能,而我找不到类似的东西AVAsset.那么,有可能在AVFoundation中做同样的事情吗?

谢谢

cocoa qtkit avfoundation

8
推荐指数
1
解决办法
5891
查看次数

为什么我的基于QTKit的图像编码应用程序如此之慢?

在我正在编写的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)

macos cocoa qtkit quartz-composer

7
推荐指数
1
解决办法
1398
查看次数

如何从CVImageBuffer对象获取原始数据

我正在尝试使用cocoa从网络摄像头抓取图像.我可以使用QTKit和didOutputVideoFrame委托调用获取RGBA格式的图像,并将CVImageBuffer转换为CIImage然后转换为NSBitmapImageRep.

我知道我的相机在YUV中本地抓取,我想要的是直接从CVImageBuffer获取YUV数据,并在显示之前处理YUV帧.

我的问题是:如何从CVImageBuffer获取YUV数据?

谢谢.

macos webcam cocoa qtkit

5
推荐指数
1
解决办法
1906
查看次数

如何使用强制(MP3)类型从URL制作QTMovie播放文件?

我正在使用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,这显然是不可取的.有没有办法解决?

谢谢.

编辑

实际上,路径扩展似乎与它无关; …

cocoa mp3 qtkit objective-c progressive-download

5
推荐指数
1
解决办法
2487
查看次数

如何从一系列生成的图像创建Quicktime电影?

我需要从一系列生成的图像中创建一部电影.(我正在根据物理建模程序的输出创建图像.)

我在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下工作,但如果我尝试创建一个包含数千帧的电影,我的内存就会耗尽.这也让我觉得我没有使用正确的方法.

macos cocoa qtkit objective-c

5
推荐指数
1
解决办法
1229
查看次数

OSX 10.8中的AVKit

我们正在开发一个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发布应用程序?

macos qtkit mac-app-store

5
推荐指数
1
解决办法
789
查看次数