通过WiFi从一部Android手机直播视频

时间:2013-01-18 14:46:25

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

我已经在互联网上搜索了几天如何通过WiFi连接从Android手机到另一个Android手机实现视频流功能,但我似乎无法找到任何有用的东西。我看了Android开发人员的示例代码,stackoverflow,谷歌,Android博客,但没有。我能找到的只是某种用于流媒体的手机到桌面或桌面到手机的解决方案,但我在实施中无需借用。

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

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

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

我偶然发现spydroid,但它在桌面上使用VLC,这对我没用。


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

4 个答案:

答案 0 :(得分:53)

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

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

不幸的是,媒体播放器往往不喜欢这样,所以你有两个选择:(a)从socket到文件保存数据和(在你有一些数据之后)从媒体播放媒体播放器,或者(b)制作一个微小的http代理,在本地运行,可以接受媒体播放器的GET请求,回复HTTP标头,然后将数据从远程服务器复制到它。对于(a),您将使用文件路径或文件URL创建媒体播放器,以便(b)为其指定一个指向您的代理的http网址。

另见:

Stream live video from phone to phone using socket fd

MediaPlayer stutters at start of mp3 playback

答案 1 :(得分:9)

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

答案 2 :(得分:8)

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

答案 3 :(得分:5)

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