从iPhone上传实时流媒体视频,如Ustream或Qik

从iPhone上传实时流媒体视频,如Ustream或Qik,iphone,http,video,streaming,live,Iphone,Http,Video,Streaming,Live,如何将视频从iPhone实时流式传输到Ustream或Qik等服务器?我知道苹果有一种叫做Http直播的东西,但我找到的大多数资源都只讨论从服务器到iPhone的视频流 苹果的Http直播是我应该使用的吗?还是别的什么?谢谢。我不确定您是否可以通过HTTP直播来做到这一点。HTTP实时流媒体以10秒(大约)的长度对视频进行分段,并用这些分段创建播放列表。 因此,如果你想让iPhone成为HTTP实时流媒体的流服务器端,你必须找到一种分割视频文件并创建播放列表的方法 我不知道怎么做。抱歉。据我所知

如何将视频从iPhone实时流式传输到Ustream或Qik等服务器?我知道苹果有一种叫做Http直播的东西,但我找到的大多数资源都只讨论从服务器到iPhone的视频流


苹果的Http直播是我应该使用的吗?还是别的什么?谢谢。

我不确定您是否可以通过HTTP直播来做到这一点。HTTP实时流媒体以10秒(大约)的长度对视频进行分段,并用这些分段创建播放列表。 因此,如果你想让iPhone成为HTTP实时流媒体的流服务器端,你必须找到一种分割视频文件并创建播放列表的方法


我不知道怎么做。抱歉。

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

我这样做的方式是实现一个AVCaptureSession,它有一个在每一帧上运行的带有回调的委托。该回调通过网络将每个帧发送到服务器,服务器有一个自定义设置来接收它

以下是流程:

下面是一些代码:

// 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];
然后,输出设备的委托(此处为self)必须实现回调:

-(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 );
}
编辑/更新 有几个人询问如何在不将帧逐个发送到服务器的情况下执行此操作。答案很复杂

基本上,在上面的
didOutputSampleBuffer
函数中,您可以将样本添加到
AVAssetWriter
中。实际上,我有三个资产编写器同时处于活动状态——过去、现在和未来——在不同的线程上进行管理

过去的作者正在关闭电影文件并上传它。当前写入程序正在从相机接收样本缓冲区。未来的编剧正在打开一个新的电影文件,并为其准备数据。每5秒,我设置
pass=current;当前=未来
并重新启动序列


然后以5秒的时间段将视频上传到服务器。如果需要,您可以将视频与
ffmpeg
缝合在一起,或者将其转换为用于HTTP实时流的MPEG-2传输流。视频数据本身由asset writer进行H.264编码,因此转码只会更改文件的头格式。

我找到了一个库,可以在这方面帮助您

上面的库为您提供了通过RTMP或HLS进行流媒体传输的所有选项

只需按照本库给出的步骤仔细阅读所有说明即可。请不要直接运行此库中给出的示例代码,因为它有一些错误,而不是将所需的类和pod放入演示应用程序


我刚刚完成了这项工作,您可以录制屏幕、摄像头和音频。

他们没有使用HTTP直播。所有最近批准的应用程序实际上都使用私有API来捕获屏幕。几乎令人费解的是,苹果撤销了对这组特定CoreGraphics调用的政策,允许这些应用进入。期待在未来的iPhone操作系统版本中为该功能提供一个真正的API——这些应用程序需要在可用时使用该API。同时,这些当前的私人呼叫也没问题。嗨,我发现我们可能需要一个像Wowza这样的媒体服务器来允许RTSP流,但是你也可以做一些类似的事情,而不必通过HTTP使用RTSP。我现在在这个话题上有点不知所措。事实上,如果我错了,请纠正我。我知道人们使用私有API来捕获屏幕,但这与将它们流式传输到服务器有什么关系?谢谢我应该补充一点,我不再这样做了,因为逐帧上传对我来说太慢了。但是,如果您正在寻找一种方法来编辑来自设备摄像头的帧,这就是它。您能分享/帮助上传视频机制的代码吗?它不像您提到的那样慢?有什么提示吗?嗯,为了加速数据传输,视频必须被压缩。因此,有两种可能:1)动态压缩,需要编解码器库和大量CPU;或者2)使用iPhone内置的硬件加速mp4压缩——但它只支持流媒体到磁盘。我正在将数据流传输到磁盘,每隔几秒钟更改目标文件并上载完成的文件。这是非常棘手和复杂的,即使没有我发现的几个苹果bug的解决方法。您不能轻易地将单个文件用作管道,因为只有关闭文件后才能写入帧索引。@Nomore希望我的上述解决方案列表在中以不同的方式说明。@kashifmehmood我想您是说下载(即观看视频)?这个问题是关于将视频从iPhone传送到服务器的。一旦视频在服务器上,您将如何处理它们是一个单独的主题。流媒体包括四个步骤:(1)从硬件编码数据,(2)将数据传输到服务器,(3)将数据转换为右下游格式,(4)下载、解码和播放数据。问题是关于第二步。你的答案与第三步有关。