【问题标题】:QTKit, capture video for live streamingQTKit,为实时流媒体捕获视频
【发布时间】:2011-10-12 19:18:20
【问题描述】:

我正在尝试为 Mac 创建一个可以创建实时视频流的应用程序。我知道 VLC 和其他解决方案,但仍然知道。

为此,我正在尝试使用 QTKit 从 iSight 录制视频,并将其连续保存为一系列微小的视频文件。但是,记录结果不是很连续,文件之间存在间隙。

基本上,我只是设置了一个计时器,它以特定的时间间隔开始录制到新文件,从而停止旧录制。我还尝试设置最大记录长度,并使用委托方法 ...didFinishRecording... 和 ...willFinishRecording...,但结果相同(我无法真正估计这些情况下的差距之间的差异)。

请帮助我,如果你知道这些事情应该怎么做。

这是我当前的代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    QTCaptureSession *session = [[QTCaptureSession alloc] init];
    QTCaptureDevice *iSight = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo];
    [iSight open:nil];
    QTCaptureDeviceInput *myInput = [QTCaptureDeviceInput deviceInputWithDevice:iSight];
    output = [[QTCaptureMovieFileOutput alloc] init] ; //ivar, QTCaptureFileOutput
    [output setDelegate:self];
    a = 0; //ivar, int
    fileName = @"/Users/dtv/filerecording_"; //ivar, NSString
    [session addOutput:output error:nil];
    [session addInput:myInput error:nil];
    [capview setCaptureSession:session]; //IBOutlet
    [session startRunning]; 
    [output setCompressionOptions:[QTCompressionOptions compressionOptionsWithIdentifier:@"QTCompressionOptionsSD480SizeH264Video"] forConnection:[[output connections] objectAtIndex:0]];
    [output recordToOutputFileURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%i.mov", fileName, a]] bufferDestination:QTCaptureFileOutputBufferDestinationOldFile];
    NSTimer *tmr = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(getMovieLength:) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:tmr forMode:NSDefaultRunLoopMode];
}

‐ (void) getMovieLength:(NSTimer *) t { 一个++; [输出recordToOutputFileURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%i.mov", fileName, a]] bufferDestination:QTCaptureFileOutputBufferDestinationOldFile]; }

【问题讨论】:

    标签: cocoa qtkit live-streaming


    【解决方案1】:

    有一种本机机制可以将捕获的电影分解成碎片。使用

    [QTCaptureFileOutput setMaximumRecordedDuration:]
    

    指定乐曲的持续时间或

    [QTCaptureFileOutput setMaximumRecordedFileSize:]
    

    指定文件大小限制。

    当达到限制时,将调用委托方法:

    [QTCaptureFileOutput_Delegate captureOutput: shouldChangeOutputFileAtURL: forConnections: dueToError:]
    

    在这个方法中你可以设置新的文件名:

    [QTCaptureFileOutput recordToOutputFileURL:]
    

    这将允许您非常精确地切割录制的电影片段。

    注意,[QTCaptureFileOutput_Delegate captureOutput: didFinishRecordingToOutputFileAtURL: forConnections: dueToError:] 将在重新编码到文件实际完成后稍后调用。如果您使用此方法设置新文件,您将在最终视频中出现间隙。但这并不意味着您不需要使用此方法。此方法将在电影片段可供使用时指示。

    如果您需要更精确的切割,您可以使用

    [QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:]
    

    指定何时开始录制新片段的确切电影帧。但是,您需要更具体的知识才能使用该方法。

    【讨论】:

    • 谢谢。不幸的是,还不能检查。我会尽快接受。
    • 谢谢。它确实比以前顺畅得多。但是,仍然不完全顺利。您提到的“更具体的知识”是什么?你能告诉我在哪里可以找到吗?最好的问候,蒂莫菲。
    • 不完全流畅是什么意思?它应该工作得很好。当我说您需要更具体的知识时,我只是不知道您需要深入挖掘 Quicktime 的东西。大多数情况下,我描述的方法足以将捕获的电影分解成碎片。但是,如果您需要更精确地切割到单个帧,您可以使用[QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:] 方法。在这种情况下,您需要从缓冲区中获取数据并对其进行分析。没什么特别的,您几乎可以从文档中获得所有内容。
    • 我的意思是,当我在 VLC 中一个接一个地查看它们时(并且我确实以正确的顺序播放它们),你可以知道一个文件在哪里结束,下一个文件从哪里开始。这可能是由于 VLC 的工作方式,不过,我同意,所以我将尝试在 iMovie 中查看它。
    • 这是另一个问题。无法立即播放新电影,需要一些时间来解码帧。要顺利播放这些片段,您需要使用 [QTMovie appendSelectionFromMovie:] 方法将它们一一添加到新的 QTMovie 文件中并播放该电影。在这种情况下不会有间隙,因为电影会提前解码帧。不用担心大小,实际数据不会被复制,而是被引用。如果你将这部电影保存到磁盘上,你会看到电影文件很小,除非你当然使用 QTMovieFlatten 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2011-06-11
    • 2015-05-27
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多