2017-06-07 61 views
0

我从这里复制了一个代码https://developer.xamarin.com/recipes/android/media/video/record_video/,这是一个关于制作videostream的指令,我试图更改它的某些部分。Xamarin - 如何设置/更改VideoView显示屏预览方向

我已经尝试过使用SetOrientationHint(90)

输出方向改变为90,但由于这个代码不使用相机类,只需MediaRecorder类。我怎样才能旋转显示预览,因为它给了我+ 90度和景观预览?

我已经尝试过在xml和代码中旋转,但预览变成了全黑。

这是代码

[Activity(Label = "App2", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity, ISurfaceHolderCallback 
{ 
    string path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/test.mp4"; 
    MediaRecorder recorder; 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     //Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 
     var record = FindViewById<Button>(Resource.Id.Record); 
     var stop = FindViewById<Button>(Resource.Id.Stop); 
     var play = FindViewById<Button>(Resource.Id.Play); 
     var video = FindViewById<VideoView>(Resource.Id.SampleVideoView); 
     //video.Rotation = 90; 

     record.Click += delegate 
     { 
      if (recorder == null) 
       recorder = startRecording(video); 
      else 
       Toast.MakeText(this, "Now recording", 0).Show(); 
     }; 

     stop.Click += delegate 
     { 
      if (recorder != null) 
      { 
       stopRecording(recorder); 
       recorder = null; 
      } 
      else 
       Toast.MakeText(this, "No video recording", 0).Show(); 
     }; 

     play.Click += delegate 
     { 
      if (path != null) 
       playVideo(video); 
      else 
       Toast.MakeText(this, "No video available", 0).Show(); 
     }; 

     //recorder = startRecording(video); 
    } 

    protected override void OnDestroy() 
    { 
     base.OnDestroy(); 

     if (recorder != null) 
     { 
      recorder.Release(); 
      recorder.Dispose(); 
      recorder = null; 
     } 
    } 

    private void playVideo(VideoView video) 
    { 
     var uri = Android.Net.Uri.Parse(path); 
     video.SetVideoURI(uri); 
     video.Start(); 
    } 

    private static void stopRecording(MediaRecorder recorder) 
    { 
     if (recorder != null) 
     { 
      recorder.Stop(); 
      recorder.Release(); 
     } 
    } 

    private MediaRecorder startRecording(VideoView video) 
    { 
     MediaRecorder recorder; 
     video.StopPlayback(); 

     //video.Holder.AddCallback(this); 
     //video.Holder.SetType(SurfaceType.PushBuffers); 

     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.SetOrientationHint(90); 
     recorder.SetPreviewDisplay(video.Holder.Surface); 
     if (recorder!=null) 
     { 
      try 
      { 
       recorder.Prepare(); 
       recorder.Start(); 
      } 
      catch (Exception) 
      { 
       Toast.MakeText(this, "Exception!", 0).Show(); 
      } 
     } 
     return recorder; 
    } 

    public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height) 
    { 
     throw new NotImplementedException(); 
    } 

    public void SurfaceCreated(ISurfaceHolder holder) 
    { 
     throw new NotImplementedException(); 
    } 

    public void SurfaceDestroyed(ISurfaceHolder holder) 
    { 
     throw new NotImplementedException(); 
    } 
} 

UPDATE

@Elvis夏的回答帮了不少忙。
这是新代码

[Activity(Label = "App2", MainLauncher = true, Icon = "@drawable/icon")] 
public class MainActivity : Activity, ISurfaceHolderCallback 
{ 
    string path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/test.mp4"; 
    MediaRecorder recorder; 
    Android.Hardware.Camera mCamera; //Android.Hardware is used because it will have 
            //problem with Android.Graphics 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     //Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 
     var record = FindViewById<Button>(Resource.Id.Record); 
     var stop = FindViewById<Button>(Resource.Id.Stop); 
     var play = FindViewById<Button>(Resource.Id.Play); 
     var video = FindViewById<VideoView>(Resource.Id.SampleVideoView); 

     record.Click += delegate 
     { 
      if (recorder == null) 
       recorder = startRecording(video); 
      else 
       Toast.MakeText(this, "Now recording", 0).Show(); 
     }; 

     stop.Click += delegate 
     { 
      if (recorder != null) 
      { 
       stopRecording(recorder, mCamera); 
       recorder = null; 
      } 
      else 
       Toast.MakeText(this, "No video recording", 0).Show(); 
     }; 

     play.Click += delegate 
     { 
      if (path != null) 
       playVideo(video); 
      else 
       Toast.MakeText(this, "No video available", 0).Show(); 
     }; 

     //recorder = startRecording(video); 
    } 

    protected override void OnDestroy() 
    { 
     base.OnDestroy(); 

     if (recorder != null) 
     { 
      recorder.Release(); 
      recorder.Dispose(); 
      recorder = null; 
     } 
    } 

    private void playVideo(VideoView video) 
    { 
     var uri = Android.Net.Uri.Parse(path); 
     video.SetVideoURI(uri); 
     video.Start(); 
    } 

    private static void stopRecording(MediaRecorder recorder, Android.Hardware.Camera mCamera) 
    { 
     if (recorder != null) 
     { 
      recorder.Stop(); 
      recorder.Release(); 
      mCamera.StopPreview(); 
      mCamera.Release(); 
     } 
    } 

    private MediaRecorder startRecording(VideoView video) 
    { 
     MediaRecorder recorder; 
     video.StopPlayback(); 

     //video.Holder.AddCallback(this); 
     //video.Holder.SetType(SurfaceType.PushBuffers); 

     recorder = new MediaRecorder(); 
     mCamera = GetCameraInstance(); 
     mCamera.SetDisplayOrientation(90); 
     mCamera.Unlock(); 
     recorder.SetCamera(mCamera); 
     recorder.SetVideoSource(VideoSource.Camera); 
     recorder.SetAudioSource(AudioSource.Mic); 
     recorder.SetOutputFormat(OutputFormat.Default); 
     recorder.SetVideoEncoder(VideoEncoder.Default); 
     recorder.SetAudioEncoder(AudioEncoder.Default); 
     recorder.SetOutputFile(path); 
     recorder.SetOrientationHint(90); 
     recorder.SetPreviewDisplay(video.Holder.Surface); 
     if (recorder!=null) 
     { 
      try 
      { 
       recorder.Prepare(); 
       recorder.Start(); 
      } 
      catch (Exception) 
      { 
       Toast.MakeText(this, "Exception!", 0).Show(); 
      } 
     } 
     return recorder; 
    } 

    public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height) 
    { 
     throw new NotImplementedException(); 
    } 

    public void SurfaceCreated(ISurfaceHolder holder) 
    { 
     throw new NotImplementedException(); 
    } 

    public void SurfaceDestroyed(ISurfaceHolder holder) 
    { 
     throw new NotImplementedException(); 
    } 

    public static Android.Hardware.Camera GetCameraInstance() 
    { 
     Android.Hardware.Camera c = null; 
     try 
     { 
      c = Android.Hardware.Camera.Open(); 
     } 
     catch (Exception e) 
     { 

     } 
     return c; 
    } 
} 

回答

1

但由于该代码不使用相机类,只需MediaRecorder类。我怎样才能旋转显示预览,因为它给了我+ 90度和景观预览?

您需要设置的旋转程度后CameraMediaRecorder关联:

  1. 得到一个摄像头Instacnce通过GetCameraInstace

    public static Camera GetCameraInstance() 
    { 
        Camera c = null; 
        try 
        { 
         c = Camera.Open(); 
        } 
        catch (Exception e) 
        { 
    
        } 
        return c; 
    } 
    
  2. MainActivity.cs记录按钮点击事件,关联的cameraMediaRecorder并在之前设置方向:

    Camera mCamera 
    ... 
    
    recorder = new MediaRecorder(); 
    mCamera = ClassName.GetCameraInstance(); //ClassName if in different class. 
                 //else just GetCameraInstance(); 
    mCamera.SetDisplayOrientation(90); 
    mCamera.Unlock(); 
    recorder.SetCamera(mCamera); 
    
    recorder.SetVideoSource(VideoSource.Camera); 
    
+0

是该相机是从类Android.Hardware? 。和Utility.GetCameraInstance()中的实用程序是什么?你的班名是? – jace

+0

是的。 'Android.Hardware'中的'Camera'。 'Utility'只是一个我用来封装'GetCameraInstance'静态方法的类。 –

+0

我已经试过了,它解决了我的定位问题:)感谢您的帮助。对于其他人:不要忘记停止预览并释放相机。 – jace