微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 暂停/恢复MediaCodec

我正在尝试为我的应用程序实现暂停/恢复功能,该功能使用MediaCodec记录显示捕获.
我已经尝试过mEncoder.stop()然后调用mEncoder.start()而不调用mEncoder.release()但是没有用.再次调用mEncoder.start()时,我得到IllegalStateException.
现在我实施了一个解决方法,我在捕获完成后合并视频的和平,但合并需要很长时间.
任何人都可以帮助我吗?也许有人已经实现了这个东西?

Initialazation:

MediaCodec mEncoder;
    mEncoder = MediaCodec.createEncoderByType(Preferences.MIME_TYPE);
    mEncoder.configure(mFormat,null,MediaCodec.CONfigURE_FLAG_ENCODE);
    mInputSurface = new InputSurface(mEncoder.createInputSurface(),mSavedEglContext);
    mEncoder.start();
    try {
        String fileId = String.valueOf(System.currentTimeMillis());
        mmuxer = new Mediamuxer(dir.getPath() + "/Video"
                + fileId + ".mp4",Mediamuxer.OutputFormat.muxer_OUTPUT_MPEG_4);
        videoParts.add(fileId);
    } catch (IOException ioe) {
        throw new RuntimeException("Mediamuxer creation Failed",ioe);
    }
    isRecording = true;

暂停:

public void pauseRecordpressed() {
    if (isRecording){
        isRecording = false;
        drainEncoder(false);

        if (mEncoder != null) {
            mEncoder.stop();
        }
    }
}

取消暂停:

public void resumeRecordpressed() {
    mEncoder.start();
    isRecording = true;
}

例外:

01-09 15:34:27.980: E/AndroidRuntime(21467): FATAL EXCEPTION: main
01-09 15:34:27.980: E/AndroidRuntime(21467): Process: com.example.poc,PID: 21467
01-09 15:34:27.980: E/AndroidRuntime(21467): java.lang.IllegalStateException: start Failed
01-09 15:34:27.980: E/AndroidRuntime(21467):    at android.media.MediaCodec.start(Native Method)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at com.example.poc.MyRenderer.resumeRecordpressed(MyRenderer.java:501)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at com.example.poc.MyGLSurfaceView.resumeRecordpressed(MyGLSurfaceView.java:243)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at com.example.poc.MainActivity.onClick(MainActivity.java:775)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at android.view.View.performClick(View.java:4438)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at android.view.View$PerformClick.run(View.java:18422)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at android.os.Handler.handleCallback(Handler.java:733)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at android.os.Handler.dispatchMessage(Handler.java:95)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at android.os.Looper.loop(Looper.java:136)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at android.app.ActivityThread.main(ActivityThread.java:5017)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at java.lang.reflect.Method.invokeNative(Native Method)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at java.lang.reflect.Method.invoke(Method.java:515)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-09 15:34:27.980: E/AndroidRuntime(21467):    at dalvik.system.NativeStart.main(Native Method)

MediaFormat:

mFormat = createMediaFormat();

    private static MediaFormat createMediaFormat() {
    MediaFormat format = MediaFormat.createVideoFormat(
            Preferences.MIME_TYPE,mScreenWidth,mScreenHeight);
    format.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    format.setInteger(MediaFormat.KEY_BIT_RATE,Preferences.BIT_RATE);
    format.setInteger(MediaFormat.KEY_FRAME_RATE,Preferences.FRAME_RATE);
    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,Preferences.IFRAME_INTERVAL);
    return format;
}

解决方法

MediaCodec在停止时会丢弃其配置,因此您需要再次调用configure().我不确定你为什么要尝试重新启动它 – 你可以让它保持活跃状态​​,而不需要提供数据.

例如,请参阅Grafika中的CameraCaptureActivity,它会在重新启动活动时使编码器保持活动状态.如果您不希望在重新启动期间暂停视频暂停,则需要跟踪编码暂停的时间长度,然后调整馈送到多路复用器的时间戳.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐