两台安卓手机之间的实时视频流传输

14

我目前正在开发两台安卓手机之间的视频流传输。我编写了一个应用程序,可以将视频录制到SD卡文件中(使用MediaRecorder); 我还编写了另一个应用程序,可以显示该文件的视频。 两个应用程序都能完美地工作。

我在以下网站上找到了有关“在Android上广播视频-不写入本地文件”的网站。这正是我想要做的。

http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system

我修改了我的代码。

对于视频录制器,它是:

socket=severSocket.accept();
ParcelFileDescriptor=pfd;
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
recorder.setVideoFrameRate(15);
recorder.setVideoSize(320, 240);
recorder.setPreviewDisplay(holder.getSurface());
pfd = ParcelFileDescriptor.fromSocket(socket);
recorder.setOutputFile(pfd.getFileDescriptor());
recorder.prepare(); 
recorder.start();
视频播放器:

For Video Player:

Socket socket = new Socket(IP,PORT);
mMediaPlayer = new MediaPlayer();
pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer.setDataSource(pfd.getFileDescriptor()); // <-- here is the problem
mMediaPlayer.setDisplay(holder); 
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);            
mMediaPlayer.setOnCompletionListener(this);            
mMediaPlayer.setOnPreparedListener(this);            
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.start();

程序在 MediaPlayer 的 mMediaPlayer.setDataSource(pfd.getFileDescriptor()); 处崩溃了。 我知道我没有正确设置 DataSource。对于 ParcelFileDescriptor,必须进行其他设置以放入 MediaPlayer。

有人知道如何为 MediaPlayer 使用 ParcelFileDescriptor 吗? 任何有用的建议或提示都会很好......

谢谢

Will


1
这个对你有用吗?如果它能正常工作,请告诉我如何解决这个问题。 - Aravi
我很想知道你是否也解决了这个问题。我有完全相同的问题,下面的答案没有帮助。 - steveh
2个回答

4
在视频播放方面,您必须创建一个欢迎套接字。
ServerSocket welcomeSocket = new ServerSocket(portNumber);
socket soc = welcomeSocket.accept();

并使用

mMediaplayer.prepareAsync();

代替
mMediaplayer.prepare();

嗨,看起来你只设置了端口号,那主机的IP地址呢? - Albert Chen

1

Android 2.1或以下版本不支持本地视频流。我们所做的是逐帧获取图像,并将每个帧拆分为BYTE[],然后使用Socket类发送。在接收端,我们使用接收到的BYTE[]数据重建图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接