大家好,我正在开展一个项目,以通过网络流式传输 android 设备的屏幕内容。我使用 libstreaming 作为我的代码库。
我已经取得了几件事:
- 我可以使用 MediaCodec 和 VirtualDisplay(使用 MediaProjection)将屏幕录制到 mp4 文件中。这只是为了验证参数是否正常。
- 我可以通过网络从 MediaCodec (ByteBuffer) 发送数据。我已经打印了为每一帧发送的实际流,它似乎不同并且不是空的。我什至使用了wireshark,我可以看到所有使用UDP协议发送的包。
现在我有一个问题。当我使用 VLC 连接到 rtsp 服务器时,视频屏幕会打开。但我能看到的只是一个绿屏,有时是灰色的。仅仅一秒钟甚至更短的时间,有时我可以看到安卓屏幕的一部分(例如其中一个图标)。
如果我从相机流式传输视频,它正在工作的同一个项目。这让我觉得所有的分包和 rtsp 服务器都可以。
我从命令行运行 vlc,这是我得到的一个例子:
[h264 @ 0x1050cdc00] Frame num gap 45065 45063
[h264 @ 0x1050cdc00] number of reference frames (1+1) exceeds max (1; probably corrupt input), discarding one
[h264 @ 0x1050cdc00] QP 4294967291 out of range
[h264 @ 0x1050cdc00] decode_slice_header error
[h264 @ 0x10091e800] number of reference frames (1+1) exceeds max (1; probably corrupt input), discarding one
[h264 @ 0x10091e800] Frame num gap 49161 49159
[h264 @ 0x10091e800] number of reference frames (1+1) exceeds max (1; probably corrupt input), discarding one
[h264 @ 0x10091e800] QP 4294967293 out of range
[h264 @ 0x10091e800] decode_slice_header error
[h264 @ 0x10091ee00] number of reference frames (1+1) exceeds max (1; probably corrupt input), discarding one
这是来自 vlc 的日志:http: //pastebin.com/3TsDKrur
sps 和 pps 参数设置正确。当我连接到 rtsp 服务器时,我可以看到它回复了 sdp 配置,并且两个参数都在其中。
有人知道我在这里可能做错了什么吗?
谢谢。
PS:我没有发布任何代码,因为它有点大,当帧来自相机时似乎很好。如果有人需要它,我将非常乐意发布它。
更新:
我一直在尝试更多地调试代码。可能是没有正确创建 rtp 数据包?有什么方法可以检查格式是否正确?我一直在寻找一个在 java 中创建数据包的示例,但我找不到。任何建议都将受到欢迎。
到目前为止,我一直在使用 libstreaming 中的 H264Packetizer,但我认为它是不正确的,因为它是一个非常古老的代码。
在这里,您有一个从 Wireshark 截取的屏幕截图。不过这个包好像还可以。