如果您不需要应用程序中的录制和播放功能,则使用现成的流媒体应用程序和播放器是一个合理的选择。
但是,如果您确实需要它们在您的应用程序中,则必须查看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 播放开始时卡顿