通过WiFi从一台Android手机到另一台Android手机的实时流视频


115

我已经在互联网上搜索了几天,以了解如何通过WiFi连接从一个Android手机到另一个Android手机实现视频流功能,但是我似乎找不到任何有用的东西。我在android开发人员中查看了示例代码,stackoverflow,google,android博客,但一无所获。我所能找到的是某种用于流媒体的电话到桌面或桌面到电话解决方案,但是我在实现过程中没有什么可以借鉴的。

我需要使用arduino ADK控制机器人,所以我正在使用2部电话,一部将安装在机器人上,另一部将从机器人接收视频流。我之所以这样说是因为我试图在广播时间和观看时间之间实现最小的延迟。

我正在编写2个应用程序,一个主要应用程序(通过手持电话控制机器人)将控制从属应用程序并接收流,第二个从属应用程序将在机器人控制的电话上运行,从而控制电机/执行器/流式传输到主应用程序。我无法使用第三方应用程序。我需要将视频流代码集成到我的2个应用中。

有哪些选择可以实现这一目标?这也是很难做到的,因为我从未使用过视频流,很难在Java和Android开发中都做得很好。我应该如何编码/解码流,如何启动连接,是否需要使用UDP而不是TCP / IP?我真的不知道从哪里开始,哪里都没有示例代码。我很确定这可以实现。我只是找不到任何有用的方法来帮助我朝正确的方向入手。

我偶然发现了spydroid, 但它在桌面上使用VLC,因此对我不利


编辑:查看Cagney Moreau的博客。他详细介绍了如何实现这一点。


1
您能分享您的项目吗,我正在做类似的事情,但是在android和桌面(WebClient)之间流式传输视频...我想到了html5 + websockets,但我遇到了很多问题...
Buksy 2013年

1
我正在开发这样的解决方案,它与您尝试做的事情有80%相同。您需要配置VOIP服务器,然后为该VOIP创建客户端,以传输您的语音和视频。我也在寻找。如果有人知道,请告诉我。
AZ_

1
电子邮件已在我的个人资料中显示
-AZ_

1
签出我的项目。java中的所有内容并详细说明了cagneymoreau.com/stream-video-android
cagney

1
谢谢,我也在研究机器人。好玩的东西
卡尼(Cagney)

Answers:


55

如果您不需要应用程序中的录制和播放功能,则使用现成的流媒体应用程序和播放器是一个合理的选择。

但是,如果确实需要将它们放入应用程序中,则必须查看MediaRecorder API(用于服务器/相机应用程序)和MediaPlayer(用于客户端/播放器应用程序)。

服务器的快速示例代码:

// this is your network socket
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// this is the unofficially supported MPEG2TS format, suitable for streaming (Android 3.0+)
mMediaRecorder.setOutputFormat(8);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();

在播放器方面,这有点棘手,您可以尝试以下操作:

// this is your network socket, connected to the server
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(pfd.getFileDescriptor());
mMediaPlayer.prepare();
mMediaPlayer.start();

不幸的是,mediaplayer往往不喜欢这样,所以您有两种选择:(a)将套接字中的数据保存到文件中,以及(在您有一点数据之后)从文件中播放mediaplayer,或(b)制作一个很小的http在本地运行的代理,可以接受mediaplayer的GET请求,使用HTTP标头进行回复,然后将数据从远程服务器复制到该代理。对于(a),您将使用文件路径或文件url创建mediaplayer,对于(b),请为其提供指向代理的http url。

也可以看看:

使用套接字fd在手机之间流式传输实时视频

mp3播放开始时MediaPlayer口吃


2
您好亚历克斯,您是否有通过RTP从Android手机发送本地存储的音频文件的经验?
B770

嗨,你能把完整的项目寄给我吗?
Umar Asghar

1
您可以发布完整的项目吗?
Yazhini Murugaiya

其中一个是服务器套接字和客户端套接字
Yazhini Murugaiya

1
@AhmedHamdy实际上:在API级别23(Android 6.0)中,您可以使用setDataSource(MediaDataSource)代替FileDescriptor。实施MediaDataSource将使您能够自己进行网络读取和缓冲,而无需写入临时文件。
Alex I

9

我曾经做过类似的事情,但是发送视频并实时播放是一件非常复杂的事情。我建议您仅使用PNG。在我的实现中,我所做的是使用主机摄像头捕获PNG,然后通过网络将其发送到客户端,客户端将在收到图像后立即显示该图像,并从主机请求下一张图像。由于您使用的是wifi,因此通讯速度将足够快,每秒可获取8-10张图像(仅近似值,我在蓝牙上工作)。因此,这看起来像是连续的视频,但工作量却少得多。为了进行通信,您可以使用UDP套接字(更快速,更简单)或DLNA(不确定其工作原理)。


是的,这将是我的最后选择。感谢您的反馈!
androidu

3
当然,jpeg流比png流更有效吗?
隐身直升机

我只是建议使用图像,您可以使用任何所需的格式
Arveen 2014年

@krossreg>您可以为您的建议粘贴示例代码吗?
2015年

8

您可以使用IP网络摄像头,也可以使用DLNA。例如,三星设备附带一个名为AllShare的应用程序,该应用程序可以共享和访问网络上启用DLNA的设备。我认为IP网络摄像头是您最好的选择。您应该能够打开使用MX Video Player或类似工具创建的流。


2
我正在编写2个应用程序,一个主要应用程序用于控制机器人(通过手持电话)并查看机器人所看到的内容,第二个从属应用程序将在机器人捆绑的电话上运行,以控制电机/执行器/流。我无法使用第三方应用程序。我需要将视频流代码集成到我的2个应用中。
androidu

也许您可以对DLNA规范进行一些研究,并尝试制作一个供您自己使用的应用程序,或者向IP Webcam的开发人员发送电子邮件并寻求帮助。
ldam 2013年

1
逆向工程吗?:P
mgibson

是的,我猜我别无选择。
androidu

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.