我正在开发一款具有与其他应用分享屏幕功能的应用。
我已经使用了Media投影API。我使用MediaMuxer将音频和视频结合起来进行屏幕共享。
我知道Media Projection API用于屏幕录制,但我想在录制时共享屏幕。
为此,我修改了MediaMuxer类的writeSampleData,通过socket将字节发送到网络上的其他设备。
以下是代码:
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();
}
}
}
}
}
}
我按照以下链接进行了屏幕分享:
Screen recording with mediaProjection
我使用了上面示例中的一些代码并制作应用程序。
我想知道的是如何处理接收端的字节。如何格式化这些字节以从Sender Side播放实时流。
我是否遵循发送和接收字节数据的正确方法?
MediaProjection是否允许在应用程序之间录制时进行流媒体屏幕?
任何帮助都将深受赞赏。
答案 0 :(得分:1)
通常对于流式传输,包括屏幕共享,音频和视频轨道不会复用。相反,每个视频帧和音频样本都是使用像RTP / RTSP这样的协议发送的,每个数据都包含其他内容,如时间戳。
您可以查看spyadroid,这是通过RTSP将音频和视频流式传输到浏览器或VLC的良好起点。它可以传输摄像头和麦克风,但您可以根据自己的使用情况进行调整。
如果你想暂时使用套接字,你必须摆脱MediaMuxer
并直接从 Encoder 输出发送帧/样本,并附加时间戳至少为在发送CSD之后同步接收器端的回放 - 假设您以h.264格式编码 - 数据(当encoder format is changed时,您可以获得的SPS PPS,即csd-0和csd-1)到接收器< em> Decoder ,你可以configure with an output surface来渲染你的流。
一些额外的链接: