使用非标准协议流式传输视频

时间:2010-06-01 05:01:15

标签: android video-streaming

我的公司生产专门用于直播和录制视频的DVR。该视频使用标准的MPEG-4编解码器进行编码,因此Android中的编解码器应该没有问题。但是,视频使用非标准文件格式进行记录,并使用我们的专有协议进行流式传输(除此之外,我们还在每个视频帧中嵌入了水印等附加数据)。有什么方法可以让我的流拉出帧并让它在Android设备上播放?

谢谢!

3 个答案:

答案 0 :(得分:0)

Android有java.net.Socket,所以从理论上讲,您可以为专有流编写客户端。但是,我不知道如何利用现有的Android播放功能(例如MediaPlayer)。它似乎只支持播放文件或URL。 InputStream明显缺失。

答案 1 :(得分:0)

您可以创建一个套接字,将其作为“文件描述符”,并将其提供给MediaPlayer.setDataSource()

我实际上已经做了类似的事情,所以这种方法在现场进行了测试。

我忘记了如何从套接字中提取文件描述符,但我认为使用反射 - 或者更可能是本机代码 - 你可以在套接字上获得一个'impl'成员,这是一个LocalSocket或者其他东西,并有一个'fd'成员。谷歌搜索没有找到任何人描述这个,所以你必须自己探索确切的成员名称和细节。

容器格式必须是Android系统识别的东西;如有必要,您可以使用native代码创建pipe,以便您可以使用线程将自定义容器重新打包到Android支持的内容中。

我觉得Android播放“原始”H.263和H.264BP的可能性很大,但我还没有测试过。 AVI显然不适合流媒体 - 你可能不得不将视频分成短片段的AVI,并继续交换这些块 - 或者你可以探索是否支持FLV或Matroska,但要小心 - 确切的混合受支持的容器格式可能因设备而异,或者从发行版到发行版不同。

答案 2 :(得分:0)

有几个开源库,比如ffmpeg / live555,可以解决你的问题。我在ffmpeg库周围工作以编码/解码音频/视频文件。还有ffmpeg可用的java移植。您也可以提取视频和元数据的帧数据(比特率,深度等级等)。