使用媒体投影 API 在设备之间共享屏幕



我正在开发一个应用程序,它具有与其他应用程序共享屏幕的功能。

为此,我使用了媒体投影 API。我还使用MediaMuxer将音频和视频输出结合起来进行屏幕共享。

我知道媒体投影API用于屏幕录制,但我只想在录制时共享屏幕。

为此,我修改了 MediaMuxer 类的 writeSampleData 方法,通过套接字通过网络将字节发送到其他设备。

下面是代码:

OutputStream outStream;

outStream = ScreenRecordingActivity.getInstance((.socket.getOutputStream((;

void writeSampleData(final int trackIndex, final ByteBuffer byteBuf, final MediaCodec.BufferInfo bufferInfo) {
if (mStatredCount > 0) {
mMediaMuxer.writeSampleData(trackIndex, byteBuf, bufferInfo);
if (bufferInfo.size != 0) {
byteBuf.position(bufferInfo.offset);
byteBuf.limit(bufferInfo.offset + bufferInfo.size);
if (outStream != null) {
try {
byte[] bytes = new byte[byteBuf.remaining()];
byteBuf.get(bytes);
//Send the data
outStream.write(bytes);
outStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

字节通过套接字成功传输,我也能够在接收器端接收这些字节。

下面是在接收端接收字节的代码:

private class SocketThread implements Runnable {
@Override
public void run() {
Socket socket;
try {
serverSocket = new ServerSocket(SERVER_PORT);
} catch (IOException e) {
e.printStackTrace();
}
if (null != serverSocket) {
while (!Thread.currentThread().isInterrupted()) {
try {
socket = serverSocket.accept();
CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

class CommunicationThread implements Runnable {
InputStream in;
DataInputStream dis;
public CommunicationThread(Socket clientSocket) {

updateMessage("Server Started...");
}
public void run() {           
while (!Thread.currentThread().isInterrupted()) {
try {                       
byte[] data = new byte[512];               
} catch (Exception e) {                    
e.printStackTrace();
try {
fos.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
}
}

我点击了以下屏幕共享链接:

屏幕截图

屏幕录像机

使用媒体投影进行屏幕录制

我使用了上面示例中的一些代码来制作一个应用程序。

我想知道的只是如何处理接收器上的字节。如何格式化这些字节以从发送方播放实时流?

我是否遵循正确的方法来发送和接收字节数据?

媒体投影是否允许在应用程序之间录制时流式传输屏幕?

任何帮助将不胜感激。

通常,对于流式传输(包括屏幕共享(,音频和视频轨道不会复用。相反,每个视频帧和音频样本都是使用 RTP/RTSP 等协议发送的,其中每个数据块都包装有时间戳等其他内容。

您可以查看spyadroid,它是通过RTSP将音频和视频流式传输到浏览器或VLC的良好起点。它可以流式传输摄像头和麦克风,但您可以根据自己的用例对其进行调整。

如果您暂时想使用套接字,则必须摆脱MediaMuxer并直接从编码器输出发送帧/样本,至少附加时间戳以同步接收器端的播放,在发送 CSD 后 - 假设您以 h.264 格式编码 - 数据(SPS PPS 又名 csd-0 和 csd-1,您可以在编码器格式更改时获得(到接收器解码器, 可以使用输出图面对其进行配置以呈现流。

一些额外的链接:

安卓-H264-流演示

RTMP Java Muxer for Android

RTSP

RTP

网络实时通信

相关内容

  • 没有找到相关文章

最新更新