3

大家好,我希望你能帮助我解决这个问题。

问题: 我有一个 RTP 流,我在我的专用网络 (WiFi) 上进行多播。我想使用一些 android 平板电脑来显示流。平板电脑的数量不能被限制,并且质量不应该随着客户数量的增加而下降。这解释了为什么我需要多播而不是单播。

方法: 理论上,通过在服务器端创建 RTSP 或 HTTP 流,我应该能够将视频提供给我的客户。但是,我的理解是,当太多客户端同时连接时,服务器会受到性能影响,我需要避免这种情况。理想情况下,我希望所有客户端都简单地收听相同的多播。这样,客户端的数量对服务器性能没有影响。[注意:IP 是本地的,并且 TTL 设置为 0/1,因此除了我自己的网络之外,没有任何危险会被多播数据包阻塞。]

实现 为了实现上述方法,我想在 Android 中编写一个多播客户端,接收 RTP 数据包并将流拼接在一起。我用 JPEG 有效载荷尝试了这个,效果很好。然而,JPEG 的问题在于,对每一帧进行解码的BitmapFactory.decodeByteArray调用非常昂贵(几乎 100 毫秒!),这极大地限制了帧速率。网络上的负载也相当高,因为 JPEG 不是一个好的视频流协议。

我想做的是为视频做我已经为图片做的事情,即将来自 RTP 数据包的有效负载流(例如 MPEG4)拼接在一起并将其提供给“某物”。最初我认为 VideoView 可以使用原始输入流,但我错了,VV 似乎只能使用 rtsp 或 http url(正确吗?)。

解决方案? 现在,我有什么选择?由于上述原因,我想避免从原始 RTP 流设置 RTSP 服务器并为所有平板电脑提供服务。我确实环顾了 2 天,并检查了 SO 和网络上提出的所有解决方案,但似乎没有任何问题适用于我的问题(在大多数情况下,RTSP url 或单播是解决方案,但我认为我不能使用它)所以我想是时候问这个问题了。

非常感谢任何帮助!

干杯

4

3 回答 3

1

再次阅读您的帖子后,我发现了我第一次错过的东西。我使用 BitmapFactory.decodeByteArray 来自 Axis 摄像机多播的 MJPEG over HTTP。呼叫可以在几毫秒内完成。问题在于它通常希望每次调用都创建一个新的位图。有一种方法可以使位图持续存在,并且可以缩短时间。我只是不记得当时的电话,我的普通开发计算机目前正在被破坏......错误,我们的 IT 已经“升级”了,所以我不能告诉你,但你应该找到它,如果你搜索了一下。我能够在 Xoom 和 Galaxy Tab 10.1 上获得 30fps,其他一些没问题。

马克·博特彻 mboettcher@ara.com

于 2012-05-22T19:38:35.303 回答
1

好的,我检查并使用重载的 BitmapFactory.decodeByteArray 来使用在 BitmapFactory.Options 中设置了 InBitmap 标志的不可变位图。可能是我必须为位图本身做的其他事情,至少可能使它成为静态。可能还需要设置其他一些标志,但你现在绝对应该有足够的时间继续下去。

于 2012-05-22T20:00:51.653 回答
0

我们在 Android 上尝试通过 RTSP 播放 MJPEG 流时遇到问题。我们拥有的多播视频服务器无法通过 HTTP 发送 MJPEG,并且由于延迟,我们不想在 RTSP 上使用 H.264。该应用程序是一个 ROV,将实时视频发送回 Droid 进行显示。只是为了给你省很多麻烦,如果我正确理解了这个问题,你根本无法使用 Android SDK 中的任何东西,比如 MediaPlayer 等。最后我们付钱给一个人做一些自定义代码使用MPlayer、ffmpeg 和 Live555。希望这可以帮助。

于 2012-05-22T19:28:28.120 回答