这实际上不是一个问题,而是它展示了我为解决我所面临的最具挑战性的功能之一而进行的所有尝试。
我使用libstreaming库将实时视频流式传输到Wowza Server,我需要同时将其记录在SD卡中。在此,我将尽一切努力来收集社区中的新思想。
将字节流从libstreaming流复制到mp4文件
开发
我们在libstreaming库中创建了一个监听程序,将所有已发送的字节复制到mp4文件中。 Libstreaming通过LocalSocket将字节发送到Wowza服务器。它使用MediaRecorder访问摄像机和设备的麦克风,并将输出文件设置为LocalSocket的输入流。我们要做的是围绕此从InputStream扩展的输入流创建包装器,并在其中创建File输出流。因此,每次libstreaming对LocaSocket的输入流执行读取时,我们都会将所有数据复制到输出流,以尝试创建有效的MP4文件。
阻碍
当我们尝试读取文件时,它已损坏。我们意识到MP4文件中缺少元信息。特别是moov原子。我们试图延迟流的关闭,以便给时间发送此 header (这仍然是一个猜测),但是它不起作用。为了测试此数据的一致性,我们使用了付费软件来尝试恢复视频(包括标题)。它可以播放,但是主要是绿屏。因此,这成为了不可靠的解决方案。我们还尝试使用“untrunc”,这是一个免费的开源命令行程序,由于没有moov原子,它甚至无法启动恢复。
使用ffmpeg编译为android来访问相机
开发
FFMPEG具有带有Java接口(interface)的gradle插件,可在Android应用程序中使用它。我们认为我们可以通过命令行访问摄像机(它可能在“/dev/video0”中)并将其发送到媒体服务器。
阻碍
尝试访问摄像机时出现错误“权限被拒绝”。解决方法是将设备 Root 以对其进行访问,但这会使电话失去保修并可能使它们变砖。
使用ffmpeg编译为android与MediaRecorder结合使用
开发
我们试图使FFMPEG流成为通过MediaRecorder记录在手机内部的mp4文件
阻碍
FFMPEG无法流式传输尚未完成录制的MP4文件。
使用ffmpeg通过libstreaming编译到android
开发
Libstreaming使用LocalServerSocket作为应用程序和服务器之间的连接,因此我们认为可以使用与LocalServerSocket本地地址连接的ffmpeg将流直接复制到SD卡内的本地文件中。流开始后,我们还运行了ffmpeg命令,开始将数据记录到文件中。使用ffmpeg,我们相信它将以适当的方式创建MP4文件,这意味着其中包括moov atom header 。
阻碍
创建的“地址”不能通过命令行作为电话内的本地地址读取。因此无法复制。
使用OpenCV
开发
OpenCV是一个开放源代码,跨平台的库,为计算机视觉实验和应用程序提供了构建基块。它提供了用于捕获,处理和呈现图像数据的高级界面。它具有自己的API与设备相机连接,因此我们开始对其进行研究,以查看其是否具有同时传输和记录所需的功能。
障碍
我们发现,并没有真正定义库来执行此操作,而是将其更多地用作图像数学操作。我们甚至得到了使用libstreaming的建议(我们已经这样做了)。
使用Kickflip SDK
开发
Kickflip是一种媒体流服务,提供了自己的SDK,可以在android和IOS中进行开发。它还使用HLS代替了更新的协议(protocol)RTMP。
阻碍
他们的SDK要求我们使用相机 View 创建一个 Activity ,该 Activity 占据设备的整个屏幕,从而破坏了应用程序的可用性。
使用Adobe Air
开发
我们开始咨询Play商店中已有的其他应用程序开发人员,这些应用程序已流式传输到服务器。
阻碍
与这些开发人员取得联系后,他们向他们保证,使用该技术无法同时进行记录和流式传输。而且,我们将不得不使用Adobe Air从头开始重做整个应用程序。
更新
Webrtc
开发
我们在this great project之后开始使用WebRTC。我们将信令服务器包含在我们的NODEJS服务器中,并开始通过套接字进行标准握手。我们仍在通过webrtc在本地录制和流媒体之间切换。
阻碍
Webrtc并非在所有网络配置中都起作用。除此之外,摄像机的获取都是 native 代码,这使得尝试复制字节或截取字节变得更加困难。
最佳答案
如果您愿意放弃libstreaming,可以使用一个库,该库可以轻松地同时将其流化并记录到本地文件中。
https://github.com/pedroSG94/rtmp-rtsp-stream-client-java
克隆项目并运行示例应用程序。例如,点击“默认RTSP”。输入您的端点。点击“开始流”,然后点击“开始记录”。然后点击“停止流”和“停止记录”。我已经使用Wowza Server测试了它,并且效果很好。该项目还可以用作库而不是独立的应用程序。
关于Android:同时录制和流式传输,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29012335/