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

and*_*idu 112 video streaming android video-streaming live-streaming

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

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

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

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

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


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

Ale*_*x I 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();
Run Code Online (Sandbox Code Playgroud)

在玩家方面它有点棘手,你可以试试这个:

// 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();
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:

使用socket fd将实时视频从手机传输到手机

MediaPlayer在mp3播放开始时口吃

  • 你好,亚历克斯,你有任何经验通过RTP从Android手机发送本地存储的音频文件? (2认同)

Arv*_*een 9

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

  • 肯定一个jpeg流比png流更有效? (3认同)

lda*_*dam 8

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

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

Ric*_*aña 5

你可以检查它可以流式传输和播放视频的android VLC,如果你想更多地传递,你可以检查他们的GIT来分析他们的行为.祝好运!

  • 派人去挖掘vlc的代码似乎是一件非常残酷的事情...... (38认同)
  • 我正在研究Android VLC.你能告诉我如何使用它来传输视频吗? (3认同)