如果您不需要应用程序中的录制和播放功能,则使用现成的流媒体应用程序和播放器是一个合理的选择。
但是,如果确实需要将它们放入应用程序中,则必须查看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在本地运行的代理,可以接受mediaplayer的GET请求,使用HTTP标头进行回复,然后将数据从远程服务器复制到该代理。对于(a),您将使用文件路径或文件url创建mediaplayer,对于(b),请为其提供指向代理的http url。
也可以看看:
使用套接字fd在手机之间流式传输实时视频
mp3播放开始时MediaPlayer口吃