【发布时间】:2011-09-10 05:16:34
【问题描述】:
我正在尝试将网络摄像头流从 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。此外,我不明白这个类代表什么以及我应该怎么做才能使它工作:我的意思是,如果我开始(以某种方式)用从 UDP 连接接收到的字节填充这个“SampleBuffer”,那么它将自动调用@987654328 @创建时设置的函数?如果是,什么时候?何时完成单帧或接收到整个流?第三种解决方案:使用
AVFoundation框架(这在我的 Mac 上实际上都不可用)。我不明白是否真的可以从远程源开始录制,甚至从NSMutableData、char*或类似的东西开始录制。在AVFoundation Programming Guide上,我没有找到任何说明是否有可能的参考资料。
我不知道哪种解决方案最适合我的目的。任何建议将不胜感激。
此外,还有一个问题:我没有使用任何分段程序来发送视频。现在,如果我没有弄错,分段器需要将源视频拆分为更小/更短的视频,以便于发送。如果它是正确的,那么也许并不是绝对有必要让事情正常进行(可能会在以后添加)。但是,由于服务器在 linux 下运行,我无法使用 Apple 的 mediastreamsegmeter。有人可以建议与 FFMpeg 结合使用的开源分段器吗?
更新:我编辑了我的问题,添加了更多关于我从现在开始所做的事情以及我的疑问的信息。
【问题讨论】:
标签: iphone objective-c streaming ffmpeg webcam