从Ustream或Qik上传iPhone直播video

如何实时streamvideo从iPhone到服务器像Ustream或Qik? 我知道有一个叫做Http Live Streaming的东西,但是我发现的大多数资源只是谈论从服务器到iPhone的videostream。

苹果的Http生活stream是我应该使用的东西? 或者是其他东西? 谢谢。

据我所知,没有一个内置的方法来做到这一点。 正如你所说,HTTP直播stream是用于下载到iPhone。

我这样做的方法是实现一个AVCaptureSession,它具有一个在每个框架上运行的callback委托。 该callback通过networking将每个帧发送到服务器,该服务器具有用于接收它的自定义设置。

以下是stream程: https : //developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2

这里有一些代码:

// make input device NSError *deviceError; AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&deviceError]; // make output device AVCaptureVideoDataOutput *outputDevice = [[AVCaptureVideoDataOutput alloc] init]; [outputDevice setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; // initialize capture session AVCaptureSession *captureSession = [[[AVCaptureSession alloc] init] autorelease]; [captureSession addInput:inputDevice]; [captureSession addOutput:outputDevice]; // make preview layer and add so that camera's view is displayed on screen AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; previewLayer.frame = view.bounds; [view.layer addSublayer:previewLayer]; // go! [captureSession startRunning]; 

然后输出设备的委托(在这里,自己)必须执行callback:

 -(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer( sampleBuffer ); CGSize imageSize = CVImageBufferGetEncodedSize( imageBuffer ); // also in the 'mediaSpecific' dict of the sampleBuffer NSLog( @"frame captured at %.fx%.f", imageSize.width, imageSize.height ); } 

编辑/ UPDATE

有几个人问如何做到这一点,而不是一个接一个地发送帧到服务器。 答案很复杂

基本上,在上面的didOutputSampleBuffer函数中,将样本添加到AVAssetWriter 。 实际上,我曾经有三位资产作家在过去,现在和将来都在不同的线索上进行pipe理。

过去的作者正在closures电影文件并将其上传。 当前的作者正在从相机接收样本缓冲区。 未来的作家正在开发一个新的电影文件,并准备数据。 每5秒钟,我设置past=current; current=future past=current; current=future并重新启动序列。

然后以5秒的块将video上传到服务器。 如果需要,您可以使用ffmpeg将video拼接在一起,或者将它们转码为用于HTTP实况stream的MPEG-2传输stream。 video数据本身是由资产编写器进行H.264编码的,所以转码仅仅改变文件的头部格式。

我不确定你可以使用HTTP Live Streaming做到这一点。 HTTP Live Streaming以10秒(aprox。)的长度对video进行分段,并创build一个包含这些分段的播放列表。 所以如果你想让iPhone成为HTTP Live Streaming的stream媒体服务器端,你将不得不想出一种方法来分割video文件并创build播放列表。

怎么做是超出我的知识。 抱歉。