【发布时间】:2017-03-24 06:43:27
【问题描述】:
我正在尝试闲置Truiton ScreenCapture 示例,以便使用MediaProjection 记录设备屏幕
在本地保存录音时,它可以工作
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
String localFilePath = getLocalFilePath();
mMediaRecorder.setOutputFile(localFilePath);
mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.prepare();
当更改为使用 FileDescriptor 时,它不是
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
String hostname = "10.26.100.18";
int port = 2007;
Socket socket = new Socket(InetAddress.getByName(hostname), port);
ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.fromSocket(socket);
LocalServerSocket localServerSocket = new LocalServerSocket(fileDescriptor.getFileDescriptor());
mMediaRecorder.setOutputFile(localServerSocket.getFileDescriptor());
mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.prepare();
如果不使用LocalServerSocket,那么mMediaRecorder.prepare()会抛出异常,现在我正在使用,在mMediaRecorder.getSurface()下面的方法中获取异常
private VirtualDisplay createVirtualDisplay() {
return mMediaProjection.createVirtualDisplay("MainActivity",
DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mMediaRecorder.getSurface(), null /*Callbacks*/, null
/*Handler*/);
}
例外
Caused by: java.lang.IllegalStateException: failed to get surface
at android.media.MediaRecorder.getSurface(Native Method)
at com.truiton.screencapture.MainActivity$override.createVirtualDisplay(MainActivity.java:172)
at com.truiton.screencapture.MainActivity$override.onActivityResult(MainActivity.java:133)
at com.truiton.screencapture.MainActivity$override.access$dispatch(MainActivity.java)
at com.truiton.screencapture.MainActivity.onActivityResult(MainActivity.java:0)
at android.app.Activity.dispatchActivityResult(Activity.java:6456)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
这是我的 Java 服务器,在调用 mMediaRecorder.prepare() 后我得到了套接字,并且它卡在了 inputStream.read 上,因为 eccected。当我调用mMediaRecorder.start()时,Android 中的异常发生了
final byte[] buffer = new byte[1024];
try {
ServerSocket serverSocket = new ServerSocket(2007);
while (!serverSocket.isClosed()) {
Socket socket = serverSocket.accept();
File videoFile = createEmptyVideoFile();
FileOutputStream outputStream = new FileOutputStream(videoFile);
InputStream inputStream = socket.getInputStream();
int length = inputStream.read(buffer);
while (length != -1) {
outputStream.write(buffer, 0, length);
length = inputStream.read(buffer);
}
}
} catch (IOException e) {
e.printStackTrace();
}
【问题讨论】:
标签: java android android-mediarecorder android-mediaprojection