我是Xamarin工作室的初学者,我正在尝试制作一个视频录制应用程序,但它总是抛出异常。
以下是用于设置布局和点击事件的代码:

base.OnCreate(bundle);
        string path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/MyCamera/test.mp4";

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        tView = new TextureView(this);
        tView.SurfaceTextureListener = this;
        tView.Click += delegate
        {
            RecordVideo(path);
        };

        SetContentView(tView);


并记录方法:

public void RecordVideo(string path)
    {
        mRecorder = new MediaRecorder();
        mRecorder.SetAudioSource(AudioSource.Mic);
        mRecorder.SetVideoSource(VideoSource.Camera);
        mRecorder.SetOutputFormat(OutputFormat.Default);
        mRecorder.SetAudioEncoder(AudioEncoder.Default);
        mRecorder.SetVideoEncoder(VideoEncoder.Default);
        mRecorder.SetProfile(CamcorderProfile.Get(CamcorderQuality.High));
        mRecorder.SetOutputFile(path);
        mRecorder.SetMaxDuration (10000);
        mRecorder.Prepare();
        try{
            mRecorder.Start();
        }catch( Exception ex) {
            ex.GetType ();
        }
    }


以及权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />


提前致谢,
凤梨

最佳答案

我终于解决了。事实证明,这部分内容:

    mRecorder.SetOutputFormat(OutputFormat.Default);
    mRecorder.SetAudioEncoder(AudioEncoder.Default);
    mRecorder.SetVideoEncoder(VideoEncoder.Default);


还包含在Setprofile方法中,该方法导致两次设置输出格式和编码器。结果是非法状态异常。现在我的代码如下:

    mRecorder = new MediaRecorder();
    mCamera.Unlock();
    mRecorder.SetCamera(mCamera);
    mRecorder.SetAudioSource(AudioSource.Mic);
    mRecorder.SetVideoSource(VideoSource.Camera);
    mRecorder.SetProfile(CamcorderProfile.Get(CamcorderQuality.High));
    mRecorder.SetOutputFile(path);
    mRecorder.SetMaxDuration (10000);
    mRecorder.Prepare();
    mRecorder.Start();


而且我添加了mCamera.Unlock();允许mRecorder使用它。
和mRecorder.SetCamera(mCamera);确保mRecorder使用摄像机。

10-08 13:12