119

我已经在互联网上搜索了几天关于如何通过 WiFi 连接实现从安卓手机到另一部安卓手机的视频流功能,但我似乎找不到任何有用的东西。我在 android 开发人员那里寻找示例代码、stackoverflow、google、android 博客,但什么也没有。我所能找到的只是某种用于流式传输的电话到桌面或桌面到电话的解决方案,但在我的实现中没有任何东西可以借用。

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

我正在编写 2 个应用程序,一个主应用程序用于控制机器人(来自手持电话),它将控制从属应用程序并接收流,第二个从属应用程序将在机器人捆绑电话上运行,控制电机/执行器/streaming 到主应用程序。不幸的是,我无法使用第三方应用程序。我需要将视频流代码集成到我的 2 个应用程序中。

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

我偶然发现了spydroid ,但它在桌面上使用 VLC,所以它对我没有好处。


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

4

4 回答 4

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本地运行的代理,可以接受媒体播放器的 GET 请求,回复 HTTP 标头,然后将数据从远程服务器复制到它。对于 (a) 您将使用文件路径或文件 url 创建媒体播放器,对于 (b) 给它一个指向您的代理的 http url。

也可以看看:

使用套接字 fd 将实时视频从手机流式传输到手机

MediaPlayer 在 mp3 播放开始时卡顿

于 2013-01-21T05:04:59.630 回答
9

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

于 2013-01-22T16:37:33.880 回答
8

您可以使用IP 网络摄像头,也可以使用 DLNA。例如,三星设备带有一个名为 AllShare 的应用程序,它可以共享和访问网络上支持 DLNA 的设备。不过,我认为 IP 网络摄像头是您最好的选择。您应该能够使用 MX 视频播放器或类似的东西打开它创建的流。

于 2013-01-18T14:56:12.263 回答
5

您可以查看可以流式传输和播放视频的android VLC,如果您想了解更多,可以查看他们的GIT以分析他们的工作。祝你好运!

于 2013-01-27T03:28:51.680 回答