gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:29:07 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

然后输出设备的委托(delegate)(此处为 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 中。实际上,我同时让三个 Assets 编写者处于事件状态——过去、现在和 future ——在不同的线程上进行管理。

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

然后将视频以 5 秒为单位上传到服务器。您可以使用 ffmpeg 将视频拼接在一起如果需要,或者将它们转码为 MPEG-2 传输流以进行 HTTP 直播。视频数据本身由 Assets 编写器进行 H.264 编码,因此转码仅更改文件的 header 格式。

关于iphone - 从 iPhone 上传实时流媒体视频,例如 Ustream 或 Qik,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5062266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com