如何在Xamarin.Android中录制前置摄像头的视频?

时间:2014-09-30 06:16:26

标签: xamarin xamarin.android

我在用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 ();

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

3 个答案:

答案 0 :(得分: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
  

机器人:名称=&#34; android.permission.WRITE_EXTERNAL_STORAGE&#34; /&GT;第二,   这是棘手的部分,本教程中的这一行不起作用   使用前置摄像头!

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

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

     

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

     

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

答案 1 :(得分:1)

您就是这样做的:

首先确保您的最低支持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" />

使用此片段获取对前置摄像头的引用,并在录制时在视频视图中显示预览

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 ();

答案 2 :(得分:0)

我使用@ 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();
     }
   }
 }