在Android上解码RTP流(MPEG4)



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

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

方法:理论上,通过在服务器端创建 RTSP 或 HTTP 流,我应该能够将视频提供给我的客户端。但是,我的理解是,当同时连接太多客户端时,服务器会受到性能影响,我需要避免这种情况。理想情况下,我希望所有客户端都只是在同一个多播上收听。这样,客户端的数量就不会对服务器性能产生影响。[注意:IP 是本地的,TTL 设置为 0/1,因此不会有使用组播数据包阻塞我自己的网络以外的任何其他内容的危险。

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

我想做的是为视频做我已经为图片做过的事情,即将来自 RTP 数据包的有效负载流(例如 MPEG4)拼接在一起并将其馈送到"某物"。最初我认为 VideoView 可以使用原始输入流,但我错了,VV 似乎仅适用于 rtsp 或 http url(对吗?

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

任何帮助都非常感谢!

干杯

再次阅读您的帖子后,我发现了第一次错过的东西。我从安讯士摄像机多播中使用了BitmapFactory.decodeByteArray用于基于HTTP的MJPEG。通话可以在几秒钟内完成。问题是它通常希望每次调用都创建一个新的位图。有一种方法可以使位图持久化,这将使时间变慢。我只是不记得那个电话,我的普通开发计算机目前正在被摧毁......错误,由我们的IT"升级",所以我不能告诉你,但如果你搜索一下,你应该找到它。我能够在Xoom和Galaxy Tab 10.1上获得30fps,其他一些都没有问题。

马克·博特彻mboettcher@ara.com

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

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

相关内容

  • 没有找到相关文章

最新更新