MediaRecorder.stop() 失败:-1007 重启后
MediaRecorder.stop() failed: -1007 after restarting it
我录制 Android phone 屏幕的视频,并在每录制 5 秒后发送结果文件,因为我使用 UDP,所以分成 65K 字节长的块。这是代码:
@Override
public void run() {
FileInputStream fis = null;
try
{
fis = new FileInputStream(sendFile);
}
catch (Exception e) {
e.printStackTrace();
}
if (screenRecorder.isRunning()) screenRecorder.stopRecord();
try {
byte[] videoBytes = new byte[65000];
if (sendFile.exists()) {
int piecesNumber = (int)(sendFile.length() / 65000) + 1;
byte[] byteNum = ByteBuffer.allocate(4).putInt(piecesNumber).array();
sock.send(new DatagramPacket(byteNum, byteNum.length, ia, 11111));
for (int i = 0; i < piecesNumber; i++) {
fis.read(videoBytes);
DatagramPacket videoPack = new DatagramPacket(videoBytes, 65000, ia, 11111);
sock.send(videoPack);
}
try {
PrintWriter flusher = new PrintWriter(sendFile); // flush file for new part of vid
flusher.write("");
flusher.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
Log.d("RECORDED", "Sent " + videoBytes.length + " bytes");
} else Log.e("FILE", "Not found");
} catch (Exception e) {
e.printStackTrace();
}
if (!screenRecorder.isRunning()) screenRecorder.startRecord();
}
screenRecorder.startRecord() 和 stopRecord() 的代码是:
public boolean startRecord() {
if (mediaProjection == null || running) {
return false;
}
initRecorder();
if (virtualDisplay == null) createVirtualDisplay();
mediaRecorder.start();
running = true;
return true;
}
public boolean stopRecord() {
if (!running) {
return false;
}
running = false;
mediaRecorder.stop();
//mediaRecorder.reset();
//virtualDisplay.release();
//mediaProjection.stop();
return true;
}
reset() 取消注释不会改变任何内容,virtualDisplay.release() 和 mediaProjection.stop() 被注释是因为我在开始记录之前初始化了 VirtualDisplay 和 MediaProjection 的实例并且不不想取消初始化它们。
定时器的第一次迭代很顺利,我在接收 PC 上得到了视频的第一个 5 秒。但是在下一个 stop() 调用当前的活动关闭,这就是我在错误日志中看到的:
2019-03-14 12:01:37.121 18374-18473/com.petrsu.se.s2s E/MediaRecorder: stop failed: -1007
2019-03-14 12:01:37.125 18374-18473/com.petrsu.se.s2s E/AndroidRuntime: FATAL EXCEPTION: Timer-0
Process: com.petrsu.se.s2s, PID: 18374
java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.native_stop(Native Method)
at android.media.MediaRecorder.stop(MediaRecorder.java:1415)
at com.petrsu.se.s2s.ScreenRecorder.stopRecord(ScreenRecorder.java:80)
at com.petrsu.se.s2s.DataTransfer$sendTask.run(DataTransfer.java:221)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
这种行为的原因可能是什么?感谢您的任何建议。
修正了:我不应该评论
virtualDisplay.release;
我应该在每一站都释放它并在 startRecord() 中重新创建:
public boolean startRecord() {
if (mediaProjection == null || running) {
return false;
}
initRecorder();
createVirtualDisplay(); // no additional check
mediaRecorder.start();
running = true;
return true;
}
我录制 Android phone 屏幕的视频,并在每录制 5 秒后发送结果文件,因为我使用 UDP,所以分成 65K 字节长的块。这是代码:
@Override
public void run() {
FileInputStream fis = null;
try
{
fis = new FileInputStream(sendFile);
}
catch (Exception e) {
e.printStackTrace();
}
if (screenRecorder.isRunning()) screenRecorder.stopRecord();
try {
byte[] videoBytes = new byte[65000];
if (sendFile.exists()) {
int piecesNumber = (int)(sendFile.length() / 65000) + 1;
byte[] byteNum = ByteBuffer.allocate(4).putInt(piecesNumber).array();
sock.send(new DatagramPacket(byteNum, byteNum.length, ia, 11111));
for (int i = 0; i < piecesNumber; i++) {
fis.read(videoBytes);
DatagramPacket videoPack = new DatagramPacket(videoBytes, 65000, ia, 11111);
sock.send(videoPack);
}
try {
PrintWriter flusher = new PrintWriter(sendFile); // flush file for new part of vid
flusher.write("");
flusher.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
Log.d("RECORDED", "Sent " + videoBytes.length + " bytes");
} else Log.e("FILE", "Not found");
} catch (Exception e) {
e.printStackTrace();
}
if (!screenRecorder.isRunning()) screenRecorder.startRecord();
}
screenRecorder.startRecord() 和 stopRecord() 的代码是:
public boolean startRecord() {
if (mediaProjection == null || running) {
return false;
}
initRecorder();
if (virtualDisplay == null) createVirtualDisplay();
mediaRecorder.start();
running = true;
return true;
}
public boolean stopRecord() {
if (!running) {
return false;
}
running = false;
mediaRecorder.stop();
//mediaRecorder.reset();
//virtualDisplay.release();
//mediaProjection.stop();
return true;
}
reset() 取消注释不会改变任何内容,virtualDisplay.release() 和 mediaProjection.stop() 被注释是因为我在开始记录之前初始化了 VirtualDisplay 和 MediaProjection 的实例并且不不想取消初始化它们。
定时器的第一次迭代很顺利,我在接收 PC 上得到了视频的第一个 5 秒。但是在下一个 stop() 调用当前的活动关闭,这就是我在错误日志中看到的:
2019-03-14 12:01:37.121 18374-18473/com.petrsu.se.s2s E/MediaRecorder: stop failed: -1007
2019-03-14 12:01:37.125 18374-18473/com.petrsu.se.s2s E/AndroidRuntime: FATAL EXCEPTION: Timer-0
Process: com.petrsu.se.s2s, PID: 18374
java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.native_stop(Native Method)
at android.media.MediaRecorder.stop(MediaRecorder.java:1415)
at com.petrsu.se.s2s.ScreenRecorder.stopRecord(ScreenRecorder.java:80)
at com.petrsu.se.s2s.DataTransfer$sendTask.run(DataTransfer.java:221)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
这种行为的原因可能是什么?感谢您的任何建议。
修正了:我不应该评论
virtualDisplay.release;
我应该在每一站都释放它并在 startRecord() 中重新创建:
public boolean startRecord() {
if (mediaProjection == null || running) {
return false;
}
initRecorder();
createVirtualDisplay(); // no additional check
mediaRecorder.start();
running = true;
return true;
}