iphone - 在 iPhone 上使用 FFMpeg 进行网络摄像头流式传输

标签 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];
    

    这个解决方案的问题是什么都没有播放(我只看到一个黑色方 block ),即使视频保存正确(我可以使用 VLC 直接从我的磁盘播放)。此外,这不是一个好主意。这只是为了让事情顺利进行。
  • 第二种解决方案:使用 CMSampleBufferRef 存储传入的视频。这个解决方案带来了更多问题:首先,我的系统中没有 CoreMedia.framework。此外,我不明白这个类代表什么以及我应该怎么做才能使它工作:我的意思是如果我开始(以某种方式)用从 UDP 连接接收到的字节填充这个“SampleBuffer”,那么它将自动调用 CMSampleBufferMakeDataReadyCallback 函数我在创建过程中设置?如果是,什么时候?何时完成单帧或接收到整个流?
  • 第三种解决方案:使用 AVFoundation 框架(这在我的 Mac 上实际上都不可用)。我不明白是否真的可以从远程源甚至从 NSMutableDatachar* 或类似的东西开始录制。在 AVFoundation Programming Guide 上,我没有找到任何引用说明它是否可能。

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

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

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

    最佳答案

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

    至于视频保存后不播放,你确定视频是支持的格式吗?阔思 the documentation :

    This class plays any movie or audio file supported in iOS. This includes both streamed content and fixed-length files. For movie files, this typically means files with the extensions .mov, .mp4, .mpv, and .3gp and using one of the following compression standards:

    • H.264 Baseline Profile Level 3.0 video, up to 640 x 480 at 30 fps. (The Baseline profile does not support B frames.)
    • MPEG-4 Part 2 video (Simple Profile)


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

    关于iphone - 在 iPhone 上使用 FFMpeg 进行网络摄像头流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6268115/

    相关文章:

    .net - 从 SharpSSH 流式传输文件

    iphone - 退出 iPhone 应用程序后推送通知

    iphone - 样式文本字段 : iOS style

    ios - 如何解决 linker command failed with exit code 1 的错误(使用 -v 查看调用)

    ios - 设置数字格式以显示千位和小数分隔符

    iphone - 如何在 ios 中以编程方式安排事件?

    c - gst_h264_parser_identify_nalu 未在缓冲区中找到 NAL

    iphone - 如何打印ASIHTTPRequest的原始数据

    ios - 当用户单击输入密码时如何使用系统内置密码屏幕对我的应用程序进行身份验证

    c++ - 流出扩展 ASCII