Bru*_*ira 9 android opencv ffmpeg stream webrtc
这不是一个真正的问题,因为它是我尝试解决我所面临的最具挑战性功能之一的所有尝试.
我使用libstreaming库将实时视频流式传输到Wowza Server,我需要在SD卡内同时录制它.为了从社区中收集新的想法,我将在下面展示我的所有尝试.
发展
我们在libstreaming库中创建了一个拦截,将所有发送的字节复制到mp4文件中.Libstreaming通过LocalSocket将字节发送到Wowza服务器.它使用MediaRecorder访问摄像头和设备的麦克风,并将输出文件设置为LocalSocket的输入流.我们要做的是围绕从InputStream扩展的输入流创建一个包装器,并在其中创建一个File输出流.因此,每当libstreaming通过LocaSocket的输入流执行读取时,我们都会将所有数据复制到输出流,尝试创建有效的MP4文件.
障碍
当我们尝试读取文件时,它已损坏.我们意识到MP4文件中缺少元信息.特别是moov原子.我们试图延迟关闭流媒体,以便有时间发送这个标题(这仍然是一个猜测)但它没有用.为了测试这些数据的一致性,我们使用付费软件尝试恢复视频,包括标题.它变得可玩了,但它主要是绿屏.所以这成了一个不值得信赖的解决方案.我们还尝试使用"untrunc",一个免费的开源命令行程序,它甚至无法启动恢复,因为没有moov原子.
发展
FFMPEG有一个带有java接口的gradle插件,可以在Android应用程序中使用它.我们以为我们可以通过命令行访问摄像机(可能在"/ dev/video0"中)并将其发送到媒体服务器.
障碍
我们在尝试访问相机时收到错误"Permission Denied".解决方法是使设备具有访问权限,但它会使手机失去保修范围,并且可能会破坏它们.
发展
我们尝试通过MediaRecorder使FFMPEG流成为手机内部录制的mp4文件
障碍
FFMPEG无法流式传输尚未完成录制的MP4文件.
发展
Libstreaming使用LocalServerSocket作为应用程序和服务器之间的连接,因此我们认为可以使用与LocalServerSocket本地地址连接的ffmpeg将流直接复制到SD卡内的本地文件.在流式传输开始之后,我们还运行了ffmpeg命令以开始将数据记录到文件中.使用ffmpeg,我们相信它会以正确的方式创建一个MP4文件,这意味着包含了moov原子头.
障碍
创建的"地址"不能通过命令行读取,作为手机内的本地地址.所以副本是不可能的.
发展
OpenCV是一个开源的跨平台库,为计算机视觉实验和应用程序提供构建块.它提供用于捕获,处理和呈现图像数据的高级接口.它有自己的API与设备摄像头连接,所以我们开始研究它,看它是否具有同时流和记录的必要功能.
障碍
我们发现库并没有真正定义为这样做,而是更像图像数学操作.我们甚至得到了使用libstreaming的建议(我们已经这样做了).
发展
Kickflip是一种媒体流服务,为Android和IOS开发提供自己的SDK.它还使用HLS而不是RTMP,这是一种较新的协议.
障碍
他们的SDK要求我们创建一个带有摄像头视图的Activity,它占据设备的整个屏幕,打破了我们应用的可用性.
发展
我们开始咨询Play商店中已经提供的应用程序的其他开发人员,这些应用程序已经流入服务器.
障碍
与这些开发人员取得联系后,他们再次保证使用这项技术无法同时录制和流式传输.更重要的是,我们必须使用Adobe Air从头开始重做整个应用程序.
发展
我们在这个伟大的项目之后开始使用WebRTC .我们在NODEJS服务器中包含了信令服务器,并开始通过套接字进行标准握手.我们仍在通过webrtc在本地录制和流媒体之间切换.
障碍
Webrtc不适用于所有网络配置.除此之外,相机获取是所有本机代码,这使得尝试复制字节或拦截它变得更加困难.
归档时间: |
|
查看次数: |
2076 次 |
最近记录: |