Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从iphone摄像头获取实时视频流并将其发送到服务器?_Iphone_Objective C_Ffmpeg - Fatal编程技术网

如何从iphone摄像头获取实时视频流并将其发送到服务器?

如何从iphone摄像头获取实时视频流并将其发送到服务器?,iphone,objective-c,ffmpeg,Iphone,Objective C,Ffmpeg,我正在使用AVCaptureSession从iPhone摄像头捕获视频并获取实时帧,但我如何将其发送到具有帧和声音多路复用功能的服务器,以及如何使用ffmpeg完成此任务,如果任何人有关于ffmpeg的教程或任何示例,请在此处分享 我的方法是实现一个AVCaptureSession,它有一个在每一帧上运行的带有回调的委托。该回调通过网络将每个帧发送到服务器,服务器有一个自定义设置来接收它 以下是流程: 下面是一些代码: // make input device NSError *device

我正在使用
AVCaptureSession
从iPhone摄像头捕获视频并获取实时帧,但我如何将其发送到具有帧和声音多路复用功能的服务器,以及如何使用ffmpeg完成此任务,如果任何人有关于ffmpeg的教程或任何示例,请在此处分享

我的方法是实现一个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 );

    }
发送原始帧或单个图像对您来说永远都不够好(因为数据量和帧数)。你也不能通过电话合理地提供任何服务(WWAN网络有各种各样的防火墙)。您需要对视频进行编码,并将其传输到服务器,很可能是通过标准流格式(RTSP、RTMP)。iPhone上有一个H.264编码器芯片>=3GS。问题是它不是面向流的。也就是说,它最后输出解析视频所需的元数据。这就给你留下了一些选择

1) 获取原始数据并在手机上使用FFmpeg编码(将使用大量CPU和电池)

2) 为H.264/AAC输出编写自己的解析器(非常困难)

3) 分块录制和处理(将增加与分块长度相等的延迟,并在开始和停止会话时在每个分块之间减少约1/4秒的视频)。

使用AV基础框架进行视频采集。使用HTTP流媒体将其上载到服务器

还可以查看下面的另一个堆栈溢出帖子

你很可能已经知道

你不能这样做。avfoundationapi阻止了这种情况的发生 每个角度。我甚至尝试了命名管道和其他一些狡猾的unix foo。 没有这样的运气。您别无选择,只能将其写入文件。在你的 链接帖子一位用户建议设置回调以传递编码 框架。据我所知,这对于H.264流是不可能的。 捕获代理将提供以特定像素编码的图像 格式。这是电影编剧和编剧们做的 编码

是的。但是,您必须使用libx264,这会使您陷入困境 GPL领域。这与应用商店不完全兼容

为了提高效率,我建议使用AVFoundation和AVAssetWriter 原因


它有一个长故事和一个短故事

这是一个简短的例子: 去看看

这是一个起点

你可以得到它,看看他是如何提取帧的。这是一个小而简单的项目


然后你可以看看kickflip,它有一个特定的函数“encodedFrame”,一旦它被调用,编码的帧就会从这里到达,你可以用它做你想做的事情,通过websocket发送。有一大堆很难读懂的mpeg atoms代码,到目前为止,我已经完成了,谢谢你的回答,我的问题是如何将音频和视频帧从iphone发送到服务器。我知道这很旧,但我仍然停留在这个主题的服务器端。您是如何配置服务器来处理图像帧流的?developer.apple.com找不到该页面。我假设您已经在录制MOV/MP4“块”文件。您可以使用我编写的旧项目(由某人提供)来流式处理这些内容。记住,你必须保持一个单调增长的时间。换句话说,每个MOV/MP4的开始时间必须相同。这样,所有1+N文件的开头都将有“空白”空间,并且ffmpeg中由mov.c生成的时间戳将是正确的。您可以通过UDP/TCP使用RTSP/RTP,也可以使用ffmpeg的librtmp插件进行流式传输。@SteveMcFarlin您可以帮助我如何将流从本地发送到服务器,这意味着如何将流作为块发送。
 1) How to get compressed frames and audio from iPhone's camera?
 2) Encoding uncompressed frames with ffmpeg's API is fast enough for
 real-time streaming?