【问题标题】:Live-stream video from one android phone to another over WiFi通过 WiFi 将视频从一部 Android 手机实时传输到另一部
【发布时间】:2013-01-18 14:46:24
【问题描述】:

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

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

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

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

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


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

【问题讨论】:

  • 你能分享你的项目吗,我正在做类似的事情,但是在android和桌面(WebClient)之间流式传输视频......我想过html5 + websockets,但我面临很多问题......
  • 我正在开发这样的解决方案,这与您尝试做的 80% 相同。您需要配置 VOIP 服务器,然后为该 VOIP 创建客户端来传输您的语音和视频。我也在寻找它。如果有人知道,请告诉我。
  • 我的个人资料中提供了电子邮件
  • 查看我的项目。 java中的一切并详细解释cagneymoreau.com/stream-video-android
  • 谢谢我也在做机器人。有趣的东西

标签: android video streaming video-streaming live-streaming


【解决方案1】:

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

但是,如果您确实需要它们在您的应用中,则必须查看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。

另见:

Stream live video from phone to phone using socket fd

MediaPlayer stutters at start of mp3 playback

【讨论】:

  • 你好 Alex,你有通过 RTP 从安卓手机发送本地存储音频文件的经验吗?
  • 嗨,你能把它的完整项目发给我吗?
  • 你能发布你的完整项目吗?
  • 服务器socket和客户端socket哪一个
  • @AhmedHamdy 实际上:在 API 级别 23 (Android 6.0) 中,您可以使用 setDataSource(MediaDataSource) 而不是 FileDescriptor。实现MediaDataSource 将允许您进行自己的网络读取和缓冲,而无需写入临时文件。
【解决方案2】:

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

【讨论】:

  • 是的,这将是我最后的选择。感谢您的反馈!
  • 肯定 jpeg 流比 png 流更高效?
  • 我只是建议使用图像,你可以使用任何你想要的格式
  • @krossreg> 您能否根据您的建议粘贴示例代码?
【解决方案3】:

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

【讨论】:

  • 我正在编写 2 个应用程序,一个主应用程序用于控制机器人(从手持电话)并查看机器人看到的内容,第二个从属应用程序将在机器人捆绑的手机上运行,控制电机/执行器/流。不幸的是,我无法使用第三方应用程序。我需要将视频流代码集成到我的 2 个应用程序中。
  • 也许您可以对 DLNA 规范进行一些研究,并尝试为您自己的应用制作应用程序,或者向 IP 网络摄像头的开发人员发送电子邮件并寻求帮助。
  • 是的,我想我别无选择。
【解决方案4】:

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

【讨论】:

  • 我正在研究 Android VLC。你能告诉我如何使用它来播放视频吗?
猜你喜欢
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多