从Ustream或Qik上传来自iPhone的直播视频

时间:2009-12-25 08:26:05

标签: iphone http video streaming live

如何直播视频从iPhone到服务器,如Ustream或Qik?我知道苹果有一种叫做Http Live Streaming的东西,但我发现的大多数资源都只谈到从服务器到iPhone的视频流。

Apple的Http Living Streaming是我应该使用的吗?或者是其他东西?感谢。

3 个答案:

答案 0 :(得分:46)

据我所知,没有内置的方法可以做到这一点。正如您所说,HTTP Live Streaming用于下载到iPhone。

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

以下是流程: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];

然后输出设备的委托(此处为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 );
}

EDIT / UPDATE

有些人已经问过如何在不将帧逐个发送到服务器的情况下执行此操作。答案很复杂......

基本上,在上面的didOutputSampleBuffer函数中,您将样本添加到AVAssetWriter。实际上我有三个资产编写者一次活动 - 过去,现在和将来 - 在不同的线程上管理。

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

然后以5秒块的形式将视频上传到服务器。如果需要,您可以将视频与ffmpeg拼接在一起,或者将它们转码为MPEG-2传输流以进行HTTP直播。视频数据本身由资产编写者进行H.264编码,因此转码只会改变文件的标题格式。

答案 1 :(得分:0)

我发现了一个可以帮助您解决此问题的库。

HaishinKit Streaming Library

上述库为您提供了通过RTMP或HLS进行流式传输的所有选项。

只需遵循该库中给出的步骤,并仔细阅读所有说明。请不要直接执行该库中给出的运行示例代码,它存在一些错误,而不是将必需的类和pod插入您的演示应用程序中。

我刚刚完成了此操作,可以录制屏幕,摄像机和音频。

答案 2 :(得分:-4)

我不确定你能用HTTP Live Streaming做到这一点。 HTTP Live Streaming以10秒(aprox。)长度对视频进行分段,并创建包含这些段的播放列表。 因此,如果您希望iPhone成为使用HTTP Live Streaming的流服务器端,您必须找到一种方法来分割视频文件并创建播放列表。

如何做到这一点是我所不知道的。遗憾。