在Android上解码RTP流(MPEG4)

时间:2012-04-16 17:18:13

标签: android video stream rtp

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

问题: 我有一个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服务器,并出于上述原因为所有平板电脑提供服务。我确实环顾了两天,检查了SO和网上提出的所有解决方案,但似乎没有什么适用于我的问题(在大多数情况下,RTSP网址或单播是解决方案,但我不认为我可以使用我觉得终于有时间问这个问题了。

非常感谢任何帮助!

欢呼声

3 个答案:

答案 0 :(得分:1)

再次阅读你的帖子后,我接受了第一次错过的东西。我使用BitmapFactory.decodeByteArray通过Axis相机多播的HTTP上的MJPEG。呼叫可以在几毫秒内完成。问题在于它通常希望每次调用都创建一个新的Bitmap。有一种方法可以使Bitmap保持不变,并且可以缩短时间。我不能记得随叫随到的电话,我的普通开发电脑目前正在销毁......错误,升级了#39;通过我们的IT,所以我不能告诉你我的头脑,但是你应该找到它,如果你搜索一下。我能够在Xoom和Galaxy Tab 10.1上获得30fps,其他一些没问题。

Mark Boettcher mboettcher@ara.com

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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