近iPhone上的实时video上传

我试图find尽可能快地从iPhone(iOS5)上传video的最佳方式 – 如果可能,请实时上传。

我发现这个以前的问题和答案非常有用。
从iPhonestream式传输video

但是这给我留下了几个没有答案的问题。 我没有足够的代表在这个问题上发表评论 – 我认为我的问题已经超出了原始问题的范围。

所以:

  1. 正在使用AVCaptureSession / AVAssetWriter并将video切分成短片段,以便近乎实时地从iPhone快速移动(压缩)video的最佳方式?

  2. 如果是的话,有人可以提供更多关于如何使用两个AVAssetWriters和一个背景队列以避免丢失的细节(正如Steve McFarlin在上面提到的问题中提到的那样)? 我不清楚如何从一个AVAssetWriter到另一个切换工作…

  3. (关键)有没有一种简单的方法可以将切碎的video文件重新添加到全长video中……或者至less可以像播放完整的video一样播放它们? 我需要合并较小的文件看起来像一个文件都在服务器上和iPhone(预览)。

谢谢你的帮助…

那么你可以尝试在手机上进行缓冲,但由于内存有限,这对我来说似乎是反作用的。 我会尝试设置一个AVCaptureSession,并使用AVCaptureVideoDataOutput,将单独的dispatch_queue线程(如果设置将它们作为MPEG帧出售)出售给你的帧。 该线程可以把这些帧closures到一个asynchronous套接字传输,可能带有一个小的头部,表示帧编号和video格式。 或者,您也可以通过队列将数据发送到发送线程,以便监视有多less帧正在等待传输。

在接收服务器上,你会想要处理创build一个小缓冲区(比如说几秒钟),如果它们按顺序到达,那么就重新sorting帧。

最大的问题将是检测带宽,并知道何时降低质量,所以你不会结束积压的数据包等待出去。 这是一个完全不同而又复杂的话题:)如果编解码器,质量和video大小…将直接决定实时传输帧所需的带宽,那么将select关键。 在某些模式下,AVVideoCodecH264在硬件上受支持,可能是实时编码的唯一现实select。

我不认为你会为此find一个现成的例子,因为它代表了很多工作来做正确的工作。

2)下面是我如何分割文件,而不会减less太多的帧:

- (void) segmentRecording:(NSTimer*)timer { AVAssetWriter *tempAssetWriter = self.assetWriter; AVAssetWriterInput *tempAudioEncoder = self.audioEncoder; AVAssetWriterInput *tempVideoEncoder = self.videoEncoder; self.assetWriter = queuedAssetWriter; self.audioEncoder = queuedAudioEncoder; self.videoEncoder = queuedVideoEncoder; //NSLog(@"Switching encoders"); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ [tempAudioEncoder markAsFinished]; [tempVideoEncoder markAsFinished]; if (tempAssetWriter.status == AVAssetWriterStatusWriting) { if(![tempAssetWriter finishWriting]) { [self showError:[tempAssetWriter error]]; } } if (self.readyToRecordAudio && self.readyToRecordVideo) { NSError *error = nil; self.queuedAssetWriter = [[AVAssetWriter alloc] initWithURL:[self newMovieURL] fileType:(NSString *)kUTTypeMPEG4 error:&error]; if (error) { [self showError:error]; } self.queuedVideoEncoder = [self setupVideoEncoderWithAssetWriter:self.queuedAssetWriter formatDescription:videoFormatDescription bitsPerSecond:videoBPS]; self.queuedAudioEncoder = [self setupAudioEncoderWithAssetWriter:self.queuedAssetWriter formatDescription:audioFormatDescription bitsPerSecond:audioBPS]; //NSLog(@"Encoder switch finished"); } }); } 

https://github.com/chrisballinger/FFmpeg-iOS-Encoder/blob/master/AVSegmentingAppleEncoder.m

3)这是一个连接服务器上的文件的脚本

 import glob import os run = os.system # convenience alias files = glob.glob('*.mp4') out_files = [] n = 0 for file in files: out_file = "out-{0}.ts".format(n) out_files.append(out_file) full_command = "ffmpeg -i {0} -f mpegts -vcodec copy -acodec copy -vbsf h264_mp4toannexb {1}".format(file, out_file) run(full_command) n += 1 out_file_concat = '' for out_file in out_files: out_file_concat += ' {0} '.format(out_file) cat_command = 'cat {0} > full.ts'.format(out_file_concat) print cat_command run(cat_command) run("ffmpeg -i full.ts -f mp4 -vcodec copy -acodec copy -absf aac_adtstoasc full.mp4") 

https://github.com/chrisballinger/FFmpeg-iOS-Encoder/blob/master/concat-mp4.py