2014-09-30 672 views
1

我使用下面的代碼寫在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(); 

它的工作原理,但我有一個問題。它使用背景攝像頭,方向是風景。如何使用前置攝像頭錄製視頻並將方向設置爲縱向?

回答

1

這是你如何做到這一點:

首先確保你的最低支持API版本薑餅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(); 
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.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, 特別是前置相機。

+0

建議的API CamcorderProfile.get(INT,INT)不xamarin – Kartik 2014-10-01 19:33:52

+0

等效呈現是CamcorderProfile.get(INT,CamcorderQuality)。當映射本地API時,Xamarin會嘗試用它們可以引用的枚舉代替愚蠢的Android int常量 – 2014-10-01 20:03:58

+0

我的意思是:CamcorderProfile.Get(1,CamcorderQuality)在Xamarin中引發錯誤 - '方法沒有超載'獲取'需要2個參數' – Kartik 2014-10-02 03:52:24

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