微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

录制视频时切换相机?

如何解决录制视频时切换相机?

因此,我希望能够在录制视频时在前后摄像头之间切换,并且视频流不会中断。我注意到,即使是iOS内置摄像头应用程序也无法做到这一点,但我听说某些第三方应用程序可以做到这一点。 下面是xamarin.ios中的示例代码

AVCaptureMovieFileOutput movieFileOutput;
AVCaptureDevice CurrentCamera { get; set; }
AVCaptureDevice BackCamera { get; set; }
AVCaptureDevice FrontCamera { get; set; }
AVCaptureDevice Mic { get; set; }
bool HasBackCamera { get { return BackCamera != null; } }
bool HasFrontCamera { get { return FrontCamera != null; } }
bool HasMic { get { return Mic != null; } }
void SetDeviceProperties()
{
//Set up the devices
foreach(var device in AVCaptureDevice.DevicesWithMediaType(AVMediaType.Video))
{
if(device.Position == AVCaptureDevicePosition.Back)
{
BackCamera = device;
}
else
{
FrontCamera = device;
}
}
Mic = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Audio);
}

public bool SwapCameras()
{
if(HasBackCamera && HasFrontCamera)
{
var nextCamera = CurrentCamera == BackCamera ? FrontCamera : BackCamera;
NSError error = null;
var newInput = new AVCaptureDeviceInput(nextCamera,out error);
if(error != null)
{
throw new Exception(error.ToString());
}
session.BeginConfiguration();
//Remove current video input
foreach(AVCaptureDeviceInput input in session.Inputs)
{
if(input.Device.HasMediaType(AVMediaType.Video))
{
session.RemoveInput(input);
}
}
if(session.CanAddInput(newInput))
{
session.AddInput(newInput);
}
session.CommitConfiguration();
CurrentCamera = nextCamera;
CameraConfigured(this,new TArgs<AVCaptureDevice>(CurrentCamera));
}
return CurrentCamera == FrontCamera;
}

下面是视频输出的配置

var layer = new AVCaptureVideoPreviewLayer (session);
layer.VideoGravity = AVLayerVideoGravity.ResizeAspectFill;
var cameraview = new UIView ();
cameraview.Layer.AddSublayer (layer);
var filePath = Path.Combine (Path.GetTempPath (),"temporary.mov");
var fileUrl = NSUrl.FromFilename (filePath);
var movieFileOutput = new AVCaptureMovieFileOutput ();
var recordingDelegate = new MyRecordingDelegate ();
session.AddOutput (movieFileOutput);
movieFileOutput.StartRecordingToOutputFile (fileUrl,recordingDelegate);

停止录制时调用的代表(从第一个会话的removeInput中调用):

public class MyRecordingDelegate : AVCaptureFileOutputRecordingDelegate
{
    public override void FinishedRecording (AVCaptureFileOutput captureOutput,NSUrl outputFileUrl,NSObject [] connections,NSError error)
    {
        if (UIVideo.IsCompatibleWithSavedPhotosAlbum (outputFileUrl.Path))
        {
            var library = new ALAssetsLibrary ();
            library.WriteVideoToSavedPhotosAlbum (outputFileUrl,(path,e2) =>
            {
                if (e2 != null)
                {
                    new UIAlertView ("Error",e2.ToString (),null,"OK",null).Show ();
                }
                else
                {
                    new UIAlertView ("Saved","Saved to Photos",null).Show ();
                    File.Delete (outputFileUrl.Path);
                }
            });
        }
        else
        {
            new UIAlertView ("Incompatible","Incompatible",null).Show ();
        }
}

}

这真的有可能吗?如果是这样,我将如何更改上面的代码以在切换相机时不停止录制?

解决方法

但是,一旦开始录制,交换摄像机图标就会消失。正在进行视频录制时,无法在摄像机之间切换。

必须停止视频,然后才能重新启动新的录制。

作为一种解决方法,您可以将两个视频合并为带有音频的单个视频文件。这是本机iOS上的similar issue,您可以参考一下并将代码转换为C#。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。