网络摄像头流与iPhone上的FFMpeg

时间:2011-06-07 15:59:16

标签: iphone objective-c streaming ffmpeg webcam

我正在尝试发送并显示从linux服务器到iPhone应用程序的网络摄像头流。我不知道它是否是最好的解决方案,但是我在linux服务器上下载并安装了FFMpeg(以下是那些想要了解的人,this教程)。 FFMpeg工作正常。经过大量的游荡后,我设法将一个流发送到客户端启动

ffmpeg  -s 320x240 -f video4linux2 -i /dev/video0 -f mpegts -vcodec libx264 udp://192.168.1.34:1234

其中192.168.1.34是客户端的地址。实际上客户端是Mac,但它应该是一部iPhone。我知道正确发送和接收流(以不同方式测试)。
但是我没有设法直接在iPhone上观看流媒体。
我想到了不同的(可能的)解决方案:

  • 第一个解决方案:将传入数据存储在NSMutableData对象中。然后,当流结束时,存储它,然后使用MPMoviePlayerController播放它。这是代码:

    [video writeToFile:@"videoStream.m4v" atomically:YES];
    NSURL *url = [NSURL fileURLWithPath:@"videoStream.m4v"];
    
    MPMoviePlayerController *videoController = [[MPMoviePlayerController alloc] initWithContentURL:url];
    
    [videoController.view setFrame:CGRectMake(100, 100, 150, 150)];
    
    [self.view addSubview:videoController.view];
    
    [videoController play];
    

    这个解决方案的问题是没有播放任何内容(我只看到黑色方块),即使视频保存正确(我可以使用VLC直接从我的磁盘播放)。此外,这不是一个好主意。这只是让事情有效。

  • 第二种解决方案:使用CMSampleBufferRef存储传入的视频。此解决方案带来了更多问题:首先,我的系统中没有CoreMedia.framework。除此之外我不太清楚这个类代表什么,我该怎么做才能使它工作:我的意思是如果我开始(不知何故)填充这个“SampleBuffer”与我从UDP连接收到的字节,然后它将自动调用{{ 1}}我在创作过程中设定的功能?如果是,何时?当单帧完成或收到整个流时?

  • 第三个解决方案:使用CMSampleBufferMakeDataReadyCallback框架(这在我的Mac上实际上都不可用)。我不明白是否可以从远程来源开始录制,甚至从AVFoundationNSMutableData或类似的东西开始录制。在char*我没有找到任何参考说明是否可能。


我不知道这个解决方案中哪一个最符合我的目的。任何建议都会受到赞赏。


此外,还有另一个问题:我没有使用任何分段程序来发送视频。现在,如果我没有出错,分段器需要将较小/较短视频中的源视频拆分更容易发送。如果它是正确的,那么也许并不是必须使事情有效(可能会在以后添加)。但是,由于服务器在linux下运行,我无法使用Apple的mediastreamsegmeter。有人建议将开源分段器与FFMpeg联合使用吗?


更新:我编辑了我的问题,添加了更多关于我现在所做的事情以及我的疑虑的信息。

4 个答案:

答案 0 :(得分:1)

MPMoviePlayerController可以处理流式视频,尝试直接将URL传递给它。

对于即使保存的视频无法播放,您确定视频是否支持格式? Quoth the documentation

  

此类播放iOS中支持的任何电影或音频文件。这包括流内容和固定长度文件。对于电影文件,这通常意味着扩展名为.mov,.mp4,.mpv和.3gp的文件,并使用以下压缩标准之一:

     
      
  • H.264 Baseline Profile Level 3.0视频,最高640 x 480,30 fps。 (基线配置文件不支持B帧。)
  •   
  • MPEG-4第2部分视频(简介)
  •   

尝试在ffmpeg命令行上使用-vcodec libx264 -vpre baseline来使用基线配置文件。

答案 1 :(得分:1)

不是将流作为UDP发送,而是尝试使用RTSP发送流.MPMoviePlayerController将播放它。

答案 2 :(得分:1)

Carson McDonald为HTTP Live Streaming实施了一个出色的解决方案,他从Linux到iOS使用它。他是这里的用户,他的网站是Ion Cannon

有关详细信息,请参阅此question

答案 3 :(得分:0)