信息: 我有一个使用 USB 连接到我的 Android 设备(媒体播放器)的外部摄像头。 我可以读取相机的输出,并收到包含数据的
ByteArray
。
问题: 现在我想使用
ByteArray
元素在 WebView
中显示该流(<video>
缓冲区)。原因是我有一个 Web 应用程序在该 Web 视图中运行,并且我想将相机预览集成到其中。但是,在 Web 视图之上的某些 TextureView
(或任何其他 Android)本机框架中显示相机输出对于将整个用户体验集成在一起将非常有限。
实现这一点的最佳方法是什么?
<video>
源获得 m3u8
元素流,该流将由设备本身提供......只是不知道该怎么做。非常感谢您的宝贵时间!
一种方法是使用
mjpeg
格式流式传输视频。
它基本上是在单个 HTTP 请求中提供的 JPEG 或 PNG 图像序列。它有自己的 MIME 类型,只需添加
<img src="your_stream.mjpeg">
即可显示在网页上。
要提供这种类型的流,您需要启动一个 http 服务器并编写一个处理程序。它应该接收客户端连接,将 MJPEG 特定标头转储给它,然后一张一张地推送图像。我没有找到 Android 的好例子,但是你可以在here找到一个 python 的例子。
Mjpeg 可能适合您的情况,因为它非常简单,并且您可以在没有外部依赖的情况下逃脱。如果您的相机默认返回 PNG 或 JPEG,那就更好了,因为您不需要进行任何可能占用资源的编码。尽管它存在一些问题:视频延迟可能是不可预测的,并且会随着时间的推移而累积。
另一种方法是使用GStreamer等媒体框架。这是一款很受欢迎的产品,并且已移植到 Android。
使用它,您可以启动一个线程,直接从相机读取数据,然后将其转换为浏览器可以理解的任何格式。
要考虑的格式:
mjpeg
所以你不必编写自己的服务器hls
(或 dash
作为替代方案),即您提到的 m3u8。视频被分割成块并写入文件系统;然后你可以通过 http 在本地提供它,并使用像 hls.js
这样的库在浏览器中播放。好处是生成的流是可查找的;不好的是延迟通常 >1 秒webrtc
是最先进的方式,如果你需要亚秒级延迟就使用它一种更简单的方法是通过 websocket 将图像作为字节数组发送,并在图像到达后立即将其显示在
<img>
标签中像这样。