【问题标题】:Webcam stream with FFMpeg on iPhone在 iPhone 上使用 FFMpeg 进行网络摄像头流式传输
【发布时间】: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 上实际上都不可用)。我不明白是否真的可以从远程源开始录制,甚至从NSMutableDatachar* 或类似的东西开始录制。在AVFoundation Programming Guide 上,我没有找到任何说明是否有可能的参考资料。


我不知道哪种解决方案最适合我的目的。任何建议将不胜感激。


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


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

【问题讨论】:

    标签: iphone objective-c streaming ffmpeg webcam


    【解决方案1】:

    MPMoviePlayerController 可以处理流媒体视频,试试直接把 URL 交给它。

    至于视频即使保存也无法播放,您确定该视频的格式受支持吗?阔思the documentation:

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

    • H.264 基线配置文件级别 3.0 视频,在 30 fps 时高达 640 x 480。 (Baseline 配置文件不支持 B 帧。)
    • MPEG-4 第 2 部分视频(简单配置文件)

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

    【讨论】:

    • 既然视频是直接通过UDP发送的,那么URL应该是什么?我已经知道 iOS 中只有少数支持的格式。我以为我可以使用该命令获得 m4v 视频流。添加 -vpre 基线没有任何改变;实际上要改变的是-f video4linux2 标志,尽管设置-f m4v(只要-f mp4,-f 3gp ecc)会给我带来“找不到moov atom”错误。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      Carson McDonald 为 HTTP Live Streaming 实现了一个出色的解决方案,他在 Linux 和 iOS 上都使用了该解决方案。他是这里的用户,他的网站是Ion Cannon

      查看question了解更多详情。

      【讨论】:

        【解决方案4】:
        猜你喜欢
        • 2016-10-23
        • 2014-08-06
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-14
        • 1970-01-01
        相关资源
        最近更新 更多