- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我当前正在编码的 cocoa 应用程序中,我从 Quartz Composer 渲染器(NSImage 对象)获取快照图像,我想将它们编码在 QTMovie 中,尺寸为 720*480、25 fps 和 H264 编解码器使用 addImage: 方法。这是相应的代码:
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])
NSLog(@"Rendering failed at time %.3fs", renderingTime);
myImage = [qRenderer snapshotImage];
[qtMovie addImage:myImage forDuration: QTMakeTimeWithTimeInterval(frameInc) withAttributes:imageAttrs];
[myImage release];
frameNum ++;
renderingTime = frameNum * frameInc;
}
[qtMovie updateMovieFile];
[qRenderer release];
[qtMovie release];
它可以工作,但是我的应用程序无法在我的新 MacBook Pro 上实时执行此操作,虽然我知道 QuickTime Broadcaster 可以以 H264 实时编码图像,其质量甚至比我在 MacBook Pro 上使用的更高。同一台计算机。
那为什么呢?这里有什么问题?这是硬件管理问题(多核线程、GPU...)还是我遗漏了什么?首先,我是 Apple 开发世界的新手(已经练习了 2 周),无论是 Objective-C、cocoa、X-code、Quicktime 还是 Quartz Composer 库等。
感谢您的帮助
最佳答案
AVFoundation 是将 QuartzComposer 动画渲染为 H.264 视频流的更有效方法。
<小时/>size_t width = 640;
size_t height = 480;
const char *outputFile = "/tmp/Arabesque.mp4";
QCComposition *composition = [QCComposition compositionWithFile:@"/System/Library/Screen Savers/Arabesque.qtz"];
QCRenderer *renderer = [[QCRenderer alloc] initOffScreenWithSize:NSMakeSize(width, height)
colorSpace:CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB) composition:composition];
unlink(outputFile);
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:@(outputFile)] fileType:AVFileTypeMPEG4 error:NULL];
NSDictionary *videoSettings = @{ AVVideoCodecKey : AVVideoCodecH264, AVVideoWidthKey : @(width), AVVideoHeightKey : @(height) };
AVAssetWriterInput* writerInput = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];
[videoWriter addInput:writerInput];
[writerInput release];
AVAssetWriterInputPixelBufferAdaptor *pixelBufferAdaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput sourcePixelBufferAttributes:NULL];
int framesPerSecond = 30;
int totalDuration = 30;
int totalFrameCount = framesPerSecond * totalDuration;
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:kCMTimeZero];
__block long frameNumber = 0;
dispatch_queue_t workQueue = dispatch_queue_create("com.example.work-queue", DISPATCH_QUEUE_SERIAL);
NSLog(@"Starting.");
[writerInput requestMediaDataWhenReadyOnQueue:workQueue usingBlock:^{
while ([writerInput isReadyForMoreMediaData]) {
NSTimeInterval frameTime = (float)frameNumber / framesPerSecond;
if (![renderer renderAtTime:frameTime arguments:NULL]) {
NSLog(@"Rendering failed at time %.3fs", frameTime);
break;
}
CVPixelBufferRef frame = (CVPixelBufferRef)[renderer createSnapshotImageOfType:@"CVPixelBuffer"];
[pixelBufferAdaptor appendPixelBuffer:frame withPresentationTime:CMTimeMake(frameNumber, framesPerSecond)];
CFRelease(frame);
frameNumber++;
if (frameNumber >= totalFrameCount) {
[writerInput markAsFinished];
[videoWriter finishWriting];
[videoWriter release];
[renderer release];
NSLog(@"Rendered %ld frames.", frameNumber);
break;
}
}
}];
<小时/>
在我的测试中,这大约是您发布的使用 QTKit 的代码的两倍。最大的改进似乎来自 H.264 编码被移交给 GPU,而不是在软件中执行。快速浏览一下配置文件,发现剩下的瓶颈是合成本身的渲染,以及将渲染数据从 GPU 读回像素缓冲区。显然,你的作文的复杂性会对此产生一些影响。
可以通过使用 QCRenderer
提供快照作为 CVOpenGLBufferRef
的功能来进一步优化这一点,这可以将帧的数据保留在 GPU 上而不是读取它返回以将其交给编码器。不过我并没有对此进行深入研究。
关于cocoa - 为什么我的基于 QTKit 的图像编码应用程序这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6033351/
我已经关注了这个 http://www.pyimagesearch.com/2015/06/15/install-opencv-3-0-and-python-2-7-on-osx/在我的 Mac 上安
我正在尝试创建一个用于 Mac 的应用程序来创建实时视频流。我了解 VLC 和其他解决方案,但仍然如此。 为此,我尝试使用 QTKit 从 iSight 录制视频,并将其连续保存为一系列小视频文件。然
我正在尝试两次导入单个电影文件(2 个单独的 QTMovie 实例),将第二个实例的音轨偏移一秒,然后将其与第一个实例的音轨混合。它不混合。第一首轨道开始播放,然后停止,第二首轨道开始播放。当我使用
每当我尝试运行 simple application to grab frames from the camera 时都会出现以下错误Macbook Pro 13"(内置 iSight): QTKit
我想使用 FFMPEG 提交申请到 Mac App Store 但我被拒绝了,因为 libavcodec 链接到已弃用的 QTKit 框架: Deprecated API Usage - Apple
我正在尝试向 QTCaptureSession 添加两个输入,如下所示: mainSession = [[QTCaptureSession alloc] init]; BOOL success; NS
我正在尝试使用 qtkit 通过我的应用程序录制和播放电影。我在一个 View 中录制视频并将其显示到另一个 View 中。我是这样做的 - (void)startRecording { NS
我正在尝试以慢动作播放电影并将其附加到现有电影中。这是我到目前为止所做的: QTMovie *originalMovie = ...; QTMovie *slowMotionMovie = ...;
我刚刚制作了一个简单的应用程序,它使用 QTKit 将两个视频合并在一起 这是问题: 我刚刚发现,如果我尝试合并两个宽度和高度不同的视频,输出的视频的高度和宽度与大视频相同,但包含带有黑色和宽边框的小
是否有 QTKit 理解的文件格式的概述? 最佳答案 您使用 QTMovie 的 +movieFileTypes: 方法从以下位置选择类型选项: QTIncludeStillImageTypes QT
在我当前正在编码的 cocoa 应用程序中,我从 Quartz Composer 渲染器(NSImage 对象)获取快照图像,我想将它们编码在 QTMovie 中,尺寸为 720*480、25 fps
我正在构建一个导出电影的应用程序。电影有一个或多个音频和视频轨道。这些轨道是从包含不同压缩方案的媒体的其他电影中提取的。当我使用 QTKit 导出我的合成电影时,我想指定每个轨道的编码。就目前而言,我
使用 AVFoundation/QTKit 如何将多个视频设备同时录制到一个文件中? 我知道如何分别记录它们,但是尝试同时记录它们会导致诸如... “无法添加到 session 中,因为源和目标媒体类
抱歉,如果这是一个非常简单的问题,但是: 我正在尝试创建 Quicktime 影片的引用影片。我正在剪切电影的一部分,然后我想将文件保存为引用而不是独立的电影。我知道如何进行切割以及如何保存独立文件,
如何以编程方式判断 QTMovie 正在播放还是暂停? 看起来很简单,但我梳理了QTMovie和 QTMovieView文档相当广泛,但找不到任何此类内容。我错过了什么? 最佳答案 您可能正在查找电影
看起来使用核心音频录制音频过于复杂。虽然 QTkit 是基本的和脚踏实地的 但是。我看到的所有示例都将视频和音频集成在一起。有人拥有或知道使用 QTkit 录制音频的示例吗? 最佳答案 Here是使用
我正在尝试在我的 Mac 上为 Python 安装 openCV,但在浏览了一堆教程之后,似乎没有一个适合我。这些是我采取的步骤 已安装 CMake 下载 OpenCV 库 使用 CMake 生成 U
我正在尝试将旧的 QuickTime 框架代码转换为 OS X 上基于 Cocoa 的 64 位 QTKit,这意味着我无法在任何时候直接调用 C 函数。具体来说,我试图找到一种使用 QTKit 编写
为 Mac 创建具有最大视频格式支持的视频播放器的最佳方法是什么? 可以将外部编解码器添加到 QTKit 吗? 如果没有人可以提供步骤教程如何为 mac 编译 ffmpeg(正确的方法,谷歌给了我很多
我有一个 Qt 项目,该项目依赖于我从源代码编译的其他第 3 方库。在编译这些第 3 方库时,我指定了用于编译的 Qt 工具包(因为这些第 3 方库依赖于 Qt) 例如,这些第 3 方库可能是使用 Q
我是一名优秀的程序员,十分优秀!