无法设置视频大小;失败,出现IllegalStateException。如何使它工作?

时间:2014-10-20 15:56:06

标签: android xamarin xamarin.android android-camera

我正在尝试修改链接到此处的示例代码,这将使用Xamarin录制视频:http://developer.xamarin.com/recipes/android/media/video/record_video/

具体来说,我正在尝试设置视频大小,因此我修改了StartRecorder方法以指定支持的视频大小:

private void StartRecorder()
{
    try
    {
        _video.StopPlayback();

        recorder = new MediaRecorder();

        recorder.SetVideoSource(VideoSource.Camera);
        recorder.SetAudioSource(AudioSource.Mic);                
        recorder.SetOutputFormat(OutputFormat.Default);

        // get suppored video sizes
        var camera = Android.Hardware.Camera.Open();
        var cameraParameters = camera.GetParameters();
        var supportedSizes = cameraParameters.SupportedVideoSizes;

        // set video size to a suppored size
        // comment this out and it works
        recorder.SetVideoSize(supportedSizes[0].Width, supportedSizes[0].Height);

        recorder.SetVideoEncoder(VideoEncoder.Default);
        recorder.SetAudioEncoder(AudioEncoder.Default);
        recorder.SetOutputFile(_path);
        recorder.SetPreviewDisplay(_video.Holder.Surface);

        recorder.Prepare();
        recorder.Start(); // fails with IllegalStateException
    }
    catch (Exception ex)
    {
        // IllegalStateException thrown
        // error message is "start failed"
    }
}

根据API specification我认为我正确使用它,但我看不出为什么我无法设置视频大小。

我这样做错了吗?有什么我想念的吗?我应该这样做吗?

2 个答案:

答案 0 :(得分:1)

以下代码适用于我的设备(galaxy S5):

var camera = Android.Hardware.Camera.Open();
var cameraParameters = camera.GetParameters();
var supportedSizes = cameraParameters.SupportedVideoSizes;
var supportedPreviewSizes = cameraParameters.SupportedPreviewSizes;

camera.SetPreviewDisplay(video.Holder);
camera.StartPreview();

camera.Unlock();


recorder = new MediaRecorder();
recorder.SetCamera(camera);

recorder.SetVideoSource(VideoSource.Camera);
recorder.SetAudioSource(AudioSource.Camcorder);
recorder.SetOutputFormat(OutputFormat.Mpeg4);

recorder.SetVideoSize(supportedSizes[0].Width, supportedSizes[0].Height);

recorder.SetVideoEncoder(VideoEncoder.Mpeg4Sp);
recorder.SetAudioEncoder(AudioEncoder.AmrNb);

recorder.SetPreviewDisplay(video.Holder.Surface);

recorder.SetOutputFile(path);
recorder.Prepare();
recorder.Start();

这里有关于通话订单的一些信息: http://developer.android.com/guide/topics/media/camera.html#capture-video

确实说Android 4上不再需要解锁,因此我不确定此示例中的所有呼叫是否实际都是必需的。在 SetVideoEncoder 之前调用 SetVideoSize 非常重要,但在您链接的API文档页面中未明确提及 - 您的示例代码已经这样做了无论如何:)。

我想您代码中缺少的最值得注意的一行是:

recorder.SetCamera(camera);

答案 1 :(得分:0)

除了你错过" recorder.SetCamera(相机);"

从CameraParameters.h中的解释

如果getSupportedVideoSizes()返回Size的空向量,则不能调用setVideoSize。

即使getSupportedVideoSizes()检索支持的视频大小的Vector,但当摄像机只有一个输出大小时,它可以返回一个空矢量。

因此,您应首先检查supportedPreviewSizes是否为空,如果为空,则不得调用SetVideoSize()。