Android:同时录制和流媒体

时间:2015-03-12 14:22:44

标签: android opencv ffmpeg stream webrtc

这不是一个真正的问题,因为它是我尝试解决我所遇到的最具挑战性功能之一的所有尝试。

我使用libstreaming库将实时视频流式传输到Wowza Server,我需要在SD卡内同时录制它。为了从社区中收集新的想法,我将在下面展示我的所有尝试。

将libstreaming流中的字节复制到mp4文件

开发

我们在libstreaming库中创建了一个拦截,将所有发送的字节复制到mp4文件中。 Libstreaming通过LocalSocket将字节发送到Wowza服务器。它使用MediaRecorder访问摄像机和设备的麦克风,并将输出文件设置为LocalSocket的输入流。我们要做的是围绕从InputStream扩展的输入流创建一个包装器,并在其中创建一个File输出流。因此,每当libstreaming通过LocaSocket的输入流执行读取时,我们都会将所有数据复制到输出流,尝试创建有效的MP4文件。

障碍

当我们尝试读取文件时,它已损坏。我们意识到MP4文件中缺少元信息。特别是moov原子。我们试图延迟关闭流媒体,以便有时间发送这个标题(这仍然是一个猜测),但它没有工作。为了测试这些数据的一致性,我们使用付费软件尝试恢复视频,包括标题。它变得可玩了,但它主要是绿屏。所以这成了一个不值得信赖的解决方案。我们还尝试使用" untrunc"这是一个免费的开源命令行程序,它甚至无法启动恢复,因为没有moov原子。

使用编译为android的ffmpeg访问摄像机

开发

FFMPEG有一个带有java界面的gradle插件,可以在Android应用程序中使用它。我们以为我们可以通过命令行访问摄像机(它可能在" / dev / video0")并将其发送到媒体服务器。

障碍

我们收到错误"权限被拒绝"试图访问相机时。解决方法是使设备具有访问权限,但它会使手机失去保修范围,并且可能会破坏它们。

使用ffmpeg编译到android并结合MediaRecorder

开发

我们尝试通过MediaRecorder

使FFMPEG流成为手机内录制的mp4文件

障碍

FFMPEG无法传输尚未完成录制的MP4文件。

使用libstreaming编译到android的ffmpeg

开发

Libstreaming使用LocalServerSocket作为应用程序和服务器之间的连接,因此我们认为可以使用与LocalServerSocket本地地址连接的ffmpeg将流直接复制到SD卡内的本地文件。在流式传输开始之后,我们还运行了ffmpeg命令以开始将数据记录到文件中。使用ffmpeg,我们相信它会以正确的方式创建一个MP4文件,这意味着包含了moov原子头。

障碍

"地址"创建不能通过命令行读取,作为手机内的本地地址。所以副本是不可能的。

使用OpenCV

开发

OpenCV是一个开源的跨平台库,为计算机视觉实验和应用程序提供构建块。它提供用于捕获,处理和呈现图像数据的高级接口。它有自己的API来连接设备摄像头,所以我们开始研究它是否具有同时流式传输和记录的必要功能。

障碍

我们发现库并没有真正定义为这样做,而是更像图像数学操作。我们甚至得到了使用libstreaming的建议(我们已经这样做了)。

使用Kickflip SDK

开发

Kickflip是一种媒体流服务,为Android和IOS开发提供自己的SDK。它还使用HLS而不是RTMP,这是一种较新的协议。

障碍

他们的SDK要求我们使用相机视图创建一个活动,该活动占据设备的整个屏幕,从而打破了我们应用的可用性。

使用Adobe Air

开发

我们已经开始咨询Play商店中已经提供的应用程序的其他开发人员,这些应用程序已经流式传输到服务器。

障碍

与这些开发人员取得联系,他们放心,使用这项技术无法同时录制和流式传输。更重要的是,我们必须使用Adobe Air从头开始重做整个应用程序。

更新

的WebRTC

开发

我们在this great project之后开始使用WebRTC。我们在NODEJS服务器中包含了信令服务器,并开始通过套接字进行标准握手。我们仍在通过webrtc在本地录制和流媒体之间切换。

障碍

Webrtc不适用于所有网络配置。除此之外,相机获取都是本机代码,这使得尝试复制字节或拦截字节变得更加困难。

2 个答案:

答案 0 :(得分:0)

只要OpenCV 3.0可用(RC1可以下载here),我们就可以在此列表中添加另一个选项:

使用内置在Motion-JPEG encoder

中的OpenCV

答案 1 :(得分:0)

如果您愿意放弃libstreaming,可以使用一个库,该库可以轻松地同时将其流化并记录到本地文件中。

https://github.com/pedroSG94/rtmp-rtsp-stream-client-java

克隆项目并运行示例应用程序。例如,点击“默认RTSP”。输入您的端点。点击“开始流”,然后点击“开始记录”。然后点击“停止流”和“停止记录”。我已经使用Wowza Server测试了它,并且效果很好。该项目也可以用作库而不是独立的应用程序。