41

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

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

4

3 回答 3

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 );
}

编辑/更新

有几个人问过如何在不将帧一一发送到服务器的情况下做到这一点。答案很复杂...

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

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

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

于 2011-04-08T21:39:47.113 回答
2

我找到了一个可以帮助你的图书馆。

HaishinKit 流媒体库

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

只需按照这个库给定的步骤并仔细阅读所有说明。请不要直接运行此库中给出的示例代码,它有一些错误,而不是获取所需的类和 pod 到您的演示应用程序中。

我刚刚完成了它,您可以录制屏幕、相机和音频。

于 2019-12-19T06:02:50.967 回答
-4

我不确定您是否可以使用 HTTP Live Streaming 做到这一点。HTTP Live Streaming 以 10 秒(大约)长度对视频进行分段,并使用这些分段创建一个播放列表。所以如果你想让 iPhone 成为 HTTP Live Streaming 的流服务器端,你必须想办法分割视频文件并创建播放列表。

如何做到这一点超出了我的知识范围。对不起。

于 2011-02-21T08:31:15.470 回答