Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa QTKit,为实时流媒体捕获视频_Cocoa_Qtkit_Live Streaming - Fatal编程技术网

Cocoa QTKit,为实时流媒体捕获视频

Cocoa QTKit,为实时流媒体捕获视频,cocoa,qtkit,live-streaming,Cocoa,Qtkit,Live Streaming,我正在尝试为Mac创建一个可以创建实时视频流的应用程序。我知道VLC和其他解决方案,但仍然 为此,我尝试使用QTKit从iSight录制视频,并将其连续保存为一系列微小的视频文件。但是,记录结果不是很连续,文件之间有间隙 基本上,我只是设置了一个计时器,它以一定的时间间隔开始记录到一个新文件,从而停止旧的记录。我还尝试设置最大记录长度,并使用委托方法…didFinishRecording。。。和…将完成记录…,但结果相同(我无法真正估计这些情况下的差距) 如果你知道这些事情应该怎么做,请帮帮我

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

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

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

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

这是我目前的代码:


-(无效)ApplicationIDFinishLaunching:(NSNotification*)通知{
QTCaptureSession*会话=[[QTCaptureSession alloc]init];
QTCaptureDevice*iSight=[QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo];
[iSight open:无];
QTCaptureDeviceInput*myInput=[QTCaptureDeviceInputDeviceInputWithDevice:iSight];
output=[[QTCaptureMovieFileOutput alloc]init];//ivar,QTCaptureFileOutput
[output setDelegate:self];
a=0;//ivar,int
fileName=@“/Users/dtv/filerecording\”///ivar,NSString
[会话addOutput:输出错误:nil];
[会话添加输入:myInput错误:nil];
[capview setCaptureSession:session];//IBOutlet
[会议开始和结束];
[output setCompressionOptions:[QTCompressionOptions CompressionOptions With Identifier:@“QTCompressionOptions SD480SizeH264视频”]用于连接:[[output connections]对象索引:0];
[output recordToOutputFileURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@“%@%i.mov”,文件名,a]]bufferDestination:QTCaptureFileOutputBufferDestinationOldFile];
NSTimer*tmr=[NSTimer timerWithTimeInterval:5目标:自选择器:@selector(getMovieLength:)userInfo:nil repeats:YES];
[[NSRunLoop currentlunloop]addTimer:tmr forMode:NSDefaultRunLoopMode];
}

&短跑;(无效)getMovieLength:(NSTimer*)t{ a++; [output recordToOutputFileURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@“%@%i.mov”,文件名,a]]bufferDestination:QTCaptureFileOutputBufferDestinationOldFile]; }


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

[QTCaptureFileOutput setMaximumRecordedDuration:]
指定工件或工件的持续时间

[QTCaptureFileOutput setMaximumRecordedFileSize:]
指定文件大小限制

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

[QTCaptureFileOutput_Delegate captureOutput: shouldChangeOutputFileAtURL: forConnections: dueToError:]
在此方法中,您可以设置新文件名:

[QTCaptureFileOutput recordToOutputFileURL:]
这将允许您非常精确地剪切录制的电影片段

请注意,[QTCaptureFileOutput\u委托captureOutput:DidFinishRedingToOutputFileAttribute:forConnections:dueToError:]将在实际完成对文件的重新编码后稍晚调用。如果使用此方法设置新文件,则最终视频中会出现间隙。但这并不意味着你不需要使用这种方法。当电影片段准备好使用时,将指示此方法

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

[QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:]

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

谢谢。不幸的是,我们还不能检查它。我一检查就接受。谢谢。它确实比以前工作得更顺畅了。但仍然不完全顺利。你提到的“更具体的知识”是什么?你能告诉我在哪里能找到它吗?向你问好,蒂莫菲。你说不完全顺利是什么意思?它应该工作得很好。当我说你需要更具体的知识时,我只是不知道你需要深入研究quicktime的东西。大多数时候,我描述的方法足以将捕获的电影分割成碎片。但是,如果您需要更精确地剪切到单个帧,可以使用
[QTCaptureFileOutput captureOutput:didOutputSampleBuffer:fromConnection:][/code>方法。在这种情况下,您需要从缓冲区获取数据并对其进行分析。没有什么特别的,你可以从文档中得到几乎所有的东西。我的意思是,当我在VLC中一个接一个地查看它们时(我确实按照正确的顺序播放它们),你可以知道一个文件的结束和下一个文件的开始。这可能是由于VLC的工作方式,但是,我同意,所以我将试着在iMovie中观察这一点。这是另一个问题。新电影无法立即播放,需要一些时间来解码帧。要顺利播放这些片段,您需要使用[QTMovie appendSelectionFromMovie:]方法将它们逐个添加到新的QTMovie文件中,然后播放该电影。在这种情况下,将没有间隙,因为电影将提前解码帧。不要担心大小,实际数据不会被复制,而是被引用。如果您将此电影保存到磁盘,您将看到电影文件很小,当然,除非您使用QTMovieFlant属性。
[QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:]