【问题标题】:How to record video from front facing camera in Xamarin.Android?如何在 Xamarin.Android 中从前置摄像头录制视频?
【发布时间】:2014-09-30 06:16:26
【问题描述】:

我在用 Xamarin 编写的 Android 应用程序中使用以下代码:

var recorder = new MediaRecorder ();
recorder.SetVideoSource (VideoSource.Camera); 
recorder.SetAudioSource (AudioSource.Mic);              
recorder.SetOutputFormat (OutputFormat.Default);
recorder.SetVideoEncoder (VideoEncoder.Default); 
recorder.SetAudioEncoder (AudioEncoder.Default);      
recorder.SetOutputFile (path);       
recorder.SetPreviewDisplay (video.Holder.Surface);         
recorder.Prepare ();
recorder.Start ();

它有效,但我有一个问题。它使用背景摄像头,方向是横向。如何使用前置摄像头录制视频并将方向设置为纵向?

【问题讨论】:

    标签: xamarin xamarin.android


    【解决方案1】:

    来源:Android can't record video with Front Facing Camera, MediaRecorder start failed: -19

    首先,确保您的权限设置正确。 具体来说,要录制视频,您需要:

     <uses-feature android:name="android.hardware.camera.front" />
     <uses-feature android:name="android.hardware.microphone"/>
    
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission
    

    android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 第二, 这是棘手的部分,教程中的这一行不起作用 前置摄像头!

    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
    

    CamcorderProfile.get() 的签名默认为配置文件 后置摄像头:

    返回第一个背面摄像头的摄像机配置文件 设备在给定的质量水平。如果设备没有背面 相机,这将返回 null。

    相反,使用 http://developer.android.com/reference/android/media/CamcorderProfile.html#get(int,%20int)。 第一个参数是你打开的相机的id, 特别是前置摄像头。

    【讨论】:

    • 建议的 API CamcorderProfile.get(int, int) 在 xamarin 中不存在
    • 等价于 CamcorderProfile.get(int, CamcorderQuality)。在映射本机 API 时,Xamarin 会尝试用枚举替换愚蠢的 Android int 常量(这很棒)
    • 我的意思是:CamcorderProfile.Get (1, CamcorderQuality) 在 Xamarin 中引发错误 - 'Get 方法没有重载需要 2 个参数'
    【解决方案2】:

    这就是你的做法:

    首先确保您支持的最低 API 版本是 Gingerbread 2.3

    其次确保所有权限都已添加到清单文件中

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

    并使用此 sn-p 获取前置摄像头的参考并在录制时在视频视图中显示预览

    if (Camera.NumberOfCameras < 2) {
            Toast.MakeText (this, "Front camera missing", ToastLength.Long).Show ();
            return;
    }
    
    _camera = Camera.Open (1);
    _camera.SetDisplayOrientation (90);
    _camera.Unlock ();
    
    recorder = new MediaRecorder ();
    
    recorder.SetCamera (_camera);
    
    recorder.SetAudioSource (AudioSource.Mic);    
    recorder.SetVideoSource (VideoSource.Camera); 
    
    recorder.SetOutputFormat (OutputFormat.Default);
    recorder.SetAudioEncoder (AudioEncoder.Default);
    recorder.SetVideoEncoder (VideoEncoder.Default);
    
    recorder.SetOutputFile (path);       
    
    recorder.SetOrientationHint (270);
    
    recorder.SetPreviewDisplay (previewVideoView.Holder.Surface);         
    recorder.Prepare ();
    recorder.Start ();
    

    【讨论】:

      【解决方案3】:

      我使用@Kartik 的解决方案稍作修改。并非所有设备都有后置摄像头(2012 Nexus 7 就是一个很好的例子)。此版本的代码会遍历所有可用的摄像头,并检查摄像头是否真的是前置摄像头。

      for (int camIndex = 0; camIndex < Camera.NumberOfCameras; camIndex++)
      {
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        Camera.GetCameraInfo(camIndex, cameraInfo);
        if (cameraInfo.Facing == CameraFacing.Front)
        {
          try
          {
            _camera = Camera.Open(camIndex);
            _camera.SetDisplayOrientation(270);
            _camera.Unlock();
           }
           catch (Exception e)
           {
             Toast.MakeText(this, "Front camera missing", ToastLength.Long).Show();
           }
         }
       }
      

      【讨论】:

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