【问题标题】:Unable to set video size; fails with IllegalStateException. How to make it work?无法设置视频大小;因 IllegalStateException 而失败。如何让它发挥作用?
【发布时间】:2014-10-21 15:09:47
【问题描述】:

我正在尝试修改链接到此处的示例代码,它将使用 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,我认为我使用正确,但我不明白为什么我无法设置视频大小。

我做错了吗?有什么我想念的吗?我应该采取不同的做法吗?

【问题讨论】:

    标签: android xamarin xamarin.android android-camera


    【解决方案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 上不再需要 Unlock,所以我不确定此示例中的所有调用是否都需要。调用 SetVideoSize before SetVideoEncoder 很重要,但在您链接的 API 文档页面上并未明确提及 - 您的示例代码已经这样做了无论如何:)。

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

    recorder.SetCamera(camera);
    

    【讨论】:

    • 这是什么变态代码?你是如何让它与那些大写的方法名一起工作的?
    • @lxknvlk ,Xamarin 最有可能
    【解决方案2】:

    除了你错过了“recorder.SetCamera(camera);”这一事实

    来自CameraParameters.h中的解释

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

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

    所以,你应该先检查supportedPreviewSizes是否为空,如果为空,则不能调用SetVideoSize()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多