MediaRecorder.stop()失败:重新启动后返回-1007

问题描述 投票:0回答:1

我录制了我的Android手机屏幕的视频,并在每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()调用当前的acitvity关闭,这就是我在错误日志中看到的:

    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)

这种行为可能是什么原因?谢谢你的任何建议。

java android mediarecorder
1个回答
0
投票

修正了:我不应该评论

virtualDisplay.release;

我应该在每一站都发布它并在startRecord()中再次创建:

public boolean startRecord() {
    if (mediaProjection == null || running) {
        return false;
    }

    initRecorder();
    createVirtualDisplay(); // no additional check
    mediaRecorder.start();
    running = true;
    return true;
}
© www.soinside.com 2019 - 2024. All rights reserved.