MediaRecorder停止失败:-1007

时间:2016-05-21 17:50:48

标签: android xamarin xamarin.android surfaceview mediarecorder

我正在使用SurfaceView显示我的智能手机上的无人机流,我想要的是记录无人机的流,但这并不容易。所以我想我可以使用MediaRecorder。对于这个问题,我已阅读了很多帖子,但他们并没有帮助我。

OnCreate我正在创建SurfaceView

        mPreview = FindViewById<SurfaceView>(Resource.Id.surfaceView1);
        holder = mPreview.Holder;
        holder.AddCallback(this);
        holder.SetFormat(Format.Rgba8888);

SurfaceCreated覆盖中,我添加了SetPreviewDisplay

        mRecorder = new Android.Media.MediaRecorder();
        mRecorder.SetPreviewDisplay(mPreview.Holder.Surface);

因此,当我点击记录按钮时,我在新线程中启动以下方法,否则SurfaceView将被卡住:

    private void StartRecord()
    {
        var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
        string path = System.IO.Path.Combine(sdCardPath, "test.mp4");

        file = new File(path);

        mRecorder.SetVideoSource(Android.Media.VideoSource.Surface);
        mRecorder.SetOutputFormat(Android.Media.OutputFormat.Mpeg4);
        mRecorder.SetVideoEncoder(Android.Media.VideoEncoder.H264);
        mRecorder.SetVideoEncodingBitRate(512 * 1000);
        mRecorder.SetVideoFrameRate(30);
        mRecorder.SetOutputFile(file.AbsolutePath);
        mRecorder.SetVideoSize(mPreview.Width, mPreview.Height);

        mRecorder.Prepare();
        mRecorder.Start();
    }

在调用mRecorder.Stop()之前没有错误:

    private void StopRecord()
    {
        if(mRecorder != null)
        {
            try
            {
                mRecorder.Stop();
            }
            catch (Java.Lang.RuntimeException e)
            {
                // Here he always comes
                file.Delete();
                System.Console.WriteLine(e);
            }
            finally
            {
                mRecorder.Release();
                mRecorder = null;
            }
        }
    }

当我检查mRecorder变量时,它在表面对象上说:failed to get surface。这很奇怪,因为当我在mRecorder开始后检查mRecorder变量时,它只有一个表面对象。

我做错了什么?

0 个答案:

没有答案