当前位置: 首页 > 知识库问答 >
问题:

媒体录像机和视频源。表面,停止失败:-1007(一个严重的Android错误)

芮雪风
2023-03-14

我正在尝试录制MediaRecorder而不使用Camera实例,而是使用Surface视频源(是的,这是可能的,但结果不是那么完美)MediaRecorder。setVideoSource(MediaRecorder.VideoSource.SURFACE)

我只是写什么问题:

下一个代码仅在某些设备上工作,在最近的设备重新启动后在某些设备上临时工作,或者根本不工作

如果不工作okMediaRecorder.stop()方法失败,下一个错误

E/MediaRecorder:停止失败:-1007 W/系统。错误:

JAVAlang.RuntimeException:停止失败。在

Android媒体媒体录像机。停止(本机方法)

刻录机mp4文件太小(千字节),无法播放

测试设备:

联想P2、小米A1的作品

不适用于小米红米5,索尼Xperia,小米红米4 Prime

您还可以阅读我的代码中的注释,以便更好地理解问题

new Thread(() -> {

    MediaRecorder mediaRecorder = new MediaRecorder();

    File file = new File(Environment.getExternalStorageDirectory()
            + File.separator + "test_media_recorder_surface_source.mp4");
    if (file.exists()) {
        file.delete();
    }

    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setOutputFile(file.getAbsolutePath());
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mediaRecorder.setVideoSize(1280, 720);
    mediaRecorder.setCaptureRate(24);

    try {
        mediaRecorder.prepare();

        int sleepTime = 1000 / 24;

        Surface surface = mediaRecorder.getSurface();

        mediaRecorder.start();

        // record something (we can also record frames here from onPreviewFrame byte arrays)
        // e.g. convert raw frame byte[] to Bitmap using mb OpenCV and then draw bitmap on canvas
        // using canvas.drawBitmap(...)
        // here we record just blue background...
        for (int i = 0; i < 120; i++) { // 5 seconds, 24 fps
            Canvas canvas = surface.lockCanvas(null);
            canvas.drawColor(Color.BLUE);
            surface.unlockCanvasAndPost(canvas);
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // on many devices stop fails with RuntimeException -1007 error code
        // I guess it works ok 100% only for modern powerful devices...
        mediaRecorder.stop();
        // E/MediaRecorder: stop failed: -1007
        // W/System.err: java.lang.RuntimeException: stop failed.
        // at android.media.MediaRecorder.stop(Native Method)

        // recorder.reset();
        mediaRecorder.release();
        // I get file with very small size (kilobytes) and it can't be played

        // ######## RESULTS ######

        // WORKS OK ON:
        // - Lenovo P2 (Android 7)
        // - Xiaomi Mi A1 (Android 8)

        // DOESN'T WORK ON (stop fails with -1007, small video file and can't be played):
        // - Xiaomi Redmi 5 (Android 7)
        // - Sony Xperia (I don't remember the exact model and Android OS)
        // - Xiaomi Redmi 4 Prime (Android 6) *

        // * p.s. on Xiaomi Redmi 4 Prime it works some time after rebooting the device
        // if I leave this smartphone for a while and try again it will fail again
        // until I reboot the device...

    } catch (Exception e) {
        e.printStackTrace();
    }
}).start();

更新#1似乎取得了一些进展可能是什么问题-代码问题(mp4/h264)

它与WEBM/VP8工作得更好,视频现在可以播放,但fps有问题,它显示1000的比例

mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.WEBM);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.VP8);

此外,MediaRecord在使用时不录制音频

mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.VORBIS);

检查Android MediaRecorder在使用MP4/H264和大于720p的分辨率时在停止时崩溃,因此在使用MediaRecorderMediaProjection录制/捕获设备屏幕时也会发生这种情况(因为它也使用Surface…)

更新2是似乎vp8编解码器工作正常,但一个问题为webm容器-没有音频!

有缺陷的Android不支持VORBIS/OGG音频编码。。。https://developer.android.com/guide/topics/media/media-formats#audio-格式


共有1个答案

阚通
2023-03-14

我想没有解决办法

所以答案是:MediaRecorder/Android有缺陷,或者移动公司在开发设备时不关心Android的所有功能

最新消息

MediaCodec在canvas上也有缺陷

mSurface = mMediaCodec.createInputSurface();
mSurface.lockHardwareCanvas()

它可以在更多使用MediaCodec的设备上工作,但仍有一些设备可能无法使用此方法正确录制视频

所以最后的答案是:不要使用lockCanvaslockHardware Canvas,当使用MediaCodecMediaRecorder时,它是错误的...

唯一的方法-OpenGl ES

关于问题的其他链接:

https://github.com/googlesamples/android-Camera2Video/issues/86 https://issuetracker.google.com/issues/111433520

 类似资料:
  • 我正在工作的视频录制应用程序,在其中我想显示预览,当用户点击记录按钮,它开始录制,当用户点击停止按钮,它停止录制。 我有视频预览在我的表面,但当我按下开始按钮,它崩溃的错误“Media.Recorder.start(本机方法)。这是我的代码,请帮助我的家伙。

  • 我有问题与媒体录音机在Android。我正在录制一个音频,它与LG P500很好地工作,但同样的代码在三星GT-S5360上不工作。我得到了错误,因为启动失败-22。 这是我正在使用的代码: 当调试时,在logcat中case为null。 请给我一些解决办法。

  • 我试着用媒体记录器在android中录制一段视频。当我试着用2.3.4版本的媒体记录器录制视频时,它在4.0及更高的版本下工作得很好,给出了启动失败异常-12。 这是我的媒体记录器代码。 我得到的运行时异常是 请帮助我如何解决这个问题。 提前致谢

  • 我使用media Recorder library来记录语音通话,除了android Oreo8.0API level 27之外,它在几乎android版本中都工作得很好。当我使用音频源VOICE_CALL时,我得到了运行时异常启动失败,当我使用音频源VOICE_COMMUNICATION时,我没有得到对方的声音,我只得到了我的声音。 你能帮忙吗

  • 我已经创建了一个android应用程序,使用媒体播放器播放文本到语音文件,但是如果其他音频/视频开始播放,那么我的音频也会播放,即同时播放两个音频。 有没有办法在开始另一个音频/视频之前停止第一个音频。 是否有任何广播接收器会在其他音频开始时被调用。 我用过- layer.play播放音频。 和暂停音频。 任何帮助都将不胜感激。

  • 大家好,我正在尝试使用两个独立的媒体播放器实例播放音频和视频文件。当我从一开始播放它时,它工作得很好。但当我寻找时,我可以看到音频和视频的延迟 这是我寻找音频和视频的代码 //sikAudio(msec); if(media播放器!=null) { // 没有直播流,如果(medialayer.get持续时间() }