- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在通过 AVCaptureSession 记录到磁盘时以 CATextLayer 的形式编写时间码。这是我到目前为止的代码,我无法在文档中找到任何内容,也无法通过谷歌向我展示这是如何实现的。
最初我使用 GPUImage 完成此操作,但代码不稳定且崩溃。库的作者确认 GPUImage 目前不能可靠地用于此目的。
CaptureSessionManager.h
#import <CoreMedia/CoreMedia.h>
#import <AVFoundation/AVFoundation.h>
@interface CaptureSessionManager:NSObject
@property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewLayer;
@property (nonatomic,strong) AVCaptureSession *captureSession;
@property (nonatomic,strong) AVCaptureMovieFileOutput *captureOutput;
@property (nonatomic,strong) AVCaptureDeviceInput *videoIn;
- (void)addVideoPreviewLayer;
- (void)addVideoInput;
- (void)addVideoOutput;
- (void)toggleDeviceCamera;
- (void)toggleRecording;
@end
CaptureSessionManager.m
#import "CaptureSessionManager.h"
#import <CoreMedia/CoreMedia.h>
#import <AVFoundation/AVFoundation.h>
#import <AssetsLibrary/AssetsLibrary.h>
#import <QuartzCore/QuartzCore.h>
#import <CoreVideo/CoreVideo.h>
#define CAPTURE_FRAMES_PER_SECOND 20
@interface CaptureSessionManager() <AVCaptureFileOutputRecordingDelegate,
AVCaptureVideoDataOutputSampleBufferDelegate> {
BOOL isRecording;
}
@end
@implementation CaptureSessionManager
@synthesize captureSession;
@synthesize previewLayer;
@synthesize captureOutput;
@synthesize videoIn;
#pragma mark Capture Session Configuration
- (id)init {
if ((self = [super init])) {
[self setCaptureSession:[[AVCaptureSession alloc] init]];
}
return self;
}
- (void)addVideoPreviewLayer {
[self setPreviewLayer:[[[AVCaptureVideoPreviewLayer alloc] initWithSession:[self captureSession]] autorelease]];
[[self previewLayer] setVideoGravity:AVLayerVideoGravityResizeAspectFill];
}
- (void)addVideoInput {
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if (videoDevice) {
NSError *error;
if ([videoDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus] &&
[videoDevice lockForConfiguration:&error]) {
[videoDevice setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
[videoDevice unlockForConfiguration];
}
videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
if (!error) {
if ([[self captureSession] canAddInput:videoIn]) {
[[self captureSession] addInput:videoIn];
} else
NSLog(@"Couldn't add video input");
}
else
NSLog(@"Couldn't create video input");
}
else
NSLog(@"Couldn't create video capture device");
}
- (void)addVideoOutput {
//ADD MOVIE FILE OUTPUT
NSLog(@"Adding movie file output");
captureOutput = [[AVCaptureMovieFileOutput alloc] init];
Float64 TotalSeconds = 60; //Total seconds
int32_t preferredTimeScale = 30; //Frames per second
CMTime maxDuration = CMTimeMakeWithSeconds(TotalSeconds, preferredTimeScale); //<<SET MAX DURATION
captureOutput.maxRecordedDuration = maxDuration;
captureOutput.minFreeDiskSpaceLimit = 1024 * 1024; //<<SET MIN FREE SPACE IN BYTES FOR RECORDING TO CONTINUE ON A VOLUME
if ([self.captureSession canAddOutput:captureOutput])
[self.captureSession addOutput:captureOutput];
//SET THE CONNECTION PROPERTIES (output properties)
[self CameraSetOutputProperties]; //(We call a method as it also has to be done after changing camera)
[self.captureSession setSessionPreset:AVCaptureSessionPresetMedium];
}
- (void) CameraSetOutputProperties
{
//SET THE CONNECTION PROPERTIES (output properties)
AVCaptureConnection *CaptureConnection = [captureOutput connectionWithMediaType:AVMediaTypeVideo];
}
- (void)toggleDeviceCamera
{
if ([[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count] > 1) //Only do if device has multiple cameras
{
NSLog(@"Toggle camera");
NSError *error;
//AVCaptureDeviceInput *videoInput = [self videoInput];
AVCaptureDeviceInput *NewVideoInput;
AVCaptureDevicePosition position = [[videoIn device] position];
if (position == AVCaptureDevicePositionBack)
{
NewVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self CameraWithPosition:AVCaptureDevicePositionFront] error:&error];
}
else if (position == AVCaptureDevicePositionFront)
{
NewVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self CameraWithPosition:AVCaptureDevicePositionBack] error:&error];
}
if (NewVideoInput != nil)
{
[self.captureSession beginConfiguration]; //We can now change the inputs and output configuration. Use commitConfiguration to end
[self.captureSession removeInput:videoIn];
if ([self.captureSession canAddInput:NewVideoInput])
{
[self.captureSession addInput:NewVideoInput];
videoIn = NewVideoInput;
}
else
{
[self.captureSession addInput:videoIn];
}
//Set the connection properties again
[self CameraSetOutputProperties];
[self.captureSession commitConfiguration];
[NewVideoInput release];
}
}
}
//********** START STOP RECORDING BUTTON **********
- (void)toggleRecording {
if (!isRecording)
{
//----- START RECORDING -----
NSLog(@"START RECORDING");
isRecording = YES;
//Create temporary URL to record to
NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"];
NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:outputPath])
{
NSError *error;
if ([fileManager removeItemAtPath:outputPath error:&error] == NO)
{
//Error - handle if requried
}
}
//Start recording
[captureOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
}
else
{
//----- STOP RECORDING -----
NSLog(@"STOP RECORDING");
isRecording = NO;
[captureOutput stopRecording];
}
}
- (AVCaptureDevice *) CameraWithPosition:(AVCaptureDevicePosition) Position
{
NSArray *Devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *Device in Devices)
{
if ([Device position] == Position)
{
return Device;
}
}
return nil;
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
NSLog(@"a");
}
//********** DID FINISH RECORDING TO OUTPUT FILE AT URL **********
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
fromConnections:(NSArray *)connections
error:(NSError *)error
{
NSLog(@"didFinishRecordingToOutputFileAtURL - enter");
BOOL RecordedSuccessfully = YES;
if ([error code] != noErr)
{
// A problem occurred: Find out if the recording was successful.
id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey];
if (value)
{
RecordedSuccessfully = [value boolValue];
}
}
if (RecordedSuccessfully)
{
//----- RECORDED SUCESSFULLY -----
NSLog(@"didFinishRecordingToOutputFileAtURL - success");
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL])
{
[library writeVideoAtPathToSavedPhotosAlbum:outputFileURL
completionBlock:^(NSURL *assetURL, NSError *error)
{
if (error)
{
}
}];
}
}
}
- (void)dealloc {
[super dealloc];
}
@end
最佳答案
好吧,我能够得到我的解决方案,我真诚地希望这对某人有所帮助。要获得用于录制视频、音频和写入磁盘的基本 AVFoundation 设置,请从 Apple 下载 RosyWriter https://developer.apple.com/library/prerelease/ios/samplecode/RosyWriter/RosyWriter.zip
之后,只需访问提供的渲染器之一。我强烈建议使用 OpenGL 渲染器。您将需要加强 UIView 绘图,但这将使您完成 90% 的工作!
关于ios - 在写入磁盘之前,在录制时将 CATextLayer Overlay 写入 AVCaptureSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30511777/
我有几个 CATextLayers。当我双击其中之一时,我希望能够编辑它的字符串。想象一下在 Keynote 或许多其他应用程序中处理文本的方式。有什么想法吗? 我想在图层前面放置一个可编辑的文本字段
我在 CATextLayer 中绘制字符时遇到问题,使得图层的大小恰好等于字符的大小。 我使用下面的代码来获取与字符串中的字符对应的字形的大小。目前我忽略了变音符号,因此我假设字形和字符之间存在一对一
我已经束手无策了。我已经尝试了我认为的消除 CATextLayer 模糊的一切方法,但无济于事。诚然,有些东西是有帮助的,但是当放大 2 倍时,文本仍然太模糊,远不及非 CATextLayer 文本的
这让我发疯。每当我更改CATextLayer.foregroundColor属性的值时,无论我做什么,该更改都是动画的。例如,我有一个称为CATextLayer的layer,它是CALayer的子层s
我在使用 CATextLayer 时遇到了一些麻烦,这可能是我造成的,但我没有找到有关此主题的任何帮助。我在 OS X 上(在 iOS 上应该是一样的)。 我创建了一个比例因子 > 1 的 CATex
我有一个具有动态长度的动态字符串。我使用 CATextlayer 在 View 中绘制它。我设置了 wrapped = YES,但我不知道如何检查 View 中 CATextlayer 的行数来为另一
我正在开发一个需要更改 很多 CATextLayers 字符串的应用程序,但是,只有其中的一个或两个字符(但一般来说,字符串的长度约为 2-5字符)。 起初我使用的 UILabels 非常慢,因此我尝
我有一个带有 CATextLayer 子层的 CALayer。当我应用变换或以其他方式调整 CALayer 的大小时,我需要 CATextLayer 在其父级的边界内调整大小。调整大小时,CAText
我想使用 CATextLayer 以 NSAttributedString 的形式显示一些部分加粗的文本 - 但仍然想使用 IB 的便利性进行定位。 有没有办法通过界面生成器放入 CATextLaye
我正在尝试构建一个自定义控件,它可能看起来像这个 Inkscape 模型: 我正在使用 drawRect() 做一些事情,但我需要为一些元素设置动画,所以我决定切换到 CALayer 的组合。我一直在
上图显示了一个红色的 CATextLayer 框架。 当我增加文本字体大小时,文本超出框架。 我正在使用捏合手势来增加字体大小。我想获取 CATextLayer 中文本的大小,以便在文本框架超出图层框
我正在尝试将 CATextLayer 添加到 UITableViewCell。问题是文本呈现为黑色,而我已经设置了它的 foregroundColor。有人能告诉我我错过了什么吗?谢谢。 CAText
如果我包装了 == YES,有没有办法让 CATextLayer 显示“...”? 最佳答案 是的,设置 truncationMode = kCATruncationEnd。它默认为 kCATrunc
这应该真的有效,但不是: CATextLayer* textLayer = [CATextLayer layer]; textLayer.string = @"text"; [textLayer se
我有与 question 相关的问题 我设置了 contentsScale 之后,文本看起来不错,但如果我应用 3d 旋转变换,文本就会变得模糊。 图片 here 初始化代码 // init
我希望我的文本被白色边框包围。我正在使用 CATextLayer 作为文本。我知道 CATextLayer 没有属性 borderColor/borderWidth。当然,我可以使用它的父类(supe
我正在尝试修改图层中文本的字体属性,但没有成功。有人可以帮忙吗?请在下面找到代码: - (id)initWithFrame:(CGRect)frame { self = [super init
我想为我的图像创建一个文本叠加层。问题是,如果我尝试添加第二个文本,比如字幕,它会忽略我的字体大小。 titleLayer.frame = CGRectMake(0, 80, imageVie
我正在尝试对 CATextLayer 的字符串属性进行动画处理,以便我可以使用 AV Foundation 在我的视频中添加时间戳。有谁知道如何设置动画以便我可以每秒更改字符串值? 最佳答案 NSSt
我想画一个这样的列表: 1. List item 1 2. List item 2 3. List item 3 这是我的代码: NSTextList *list = [[NSTextList
我是一名优秀的程序员,十分优秀!