我正在尝试发送并显示从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上实际上都不可用)。我不明白是否可以从远程来源开始录制,甚至从AVFoundation
,NSMutableData
或类似的东西开始录制。在char*
我没有找到任何参考说明是否可能。
我不知道这个解决方案中哪一个最符合我的目的。任何建议都会受到赞赏。
此外,还有另一个问题:我没有使用任何分段程序来发送视频。现在,如果我没有出错,分段器需要将较小/较短视频中的源视频拆分更容易发送。如果它是正确的,那么也许并不是必须使事情有效(可能会在以后添加)。但是,由于服务器在linux下运行,我无法使用Apple的mediastreamsegmeter。有人建议将开源分段器与FFMpeg联合使用吗?
更新:我编辑了我的问题,添加了更多关于我现在所做的事情以及我的疑虑的信息。
答案 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)